При наведении мыши вызовите window.getSelection()
, чтобы получить объект Selection . Вы можете проверить его, чтобы найти начальный и конечный текст выделения внутри <p>
. Затем замените <p>
HTML, чтобы окружить этот фрагмент текста <span class="highlighted">
:
const p = document.body.querySelector('p');
const origContent = p.textContent;
p.addEventListener('mousedown', () => {
p.textContent = origContent;
});
p.addEventListener('mouseup', (e) => {
const selection = window.getSelection();
if (!selection) {
return;
}
const range = selection.getRangeAt(0);
// If user starts highlighting on the right, and drags mouse to the left,
// endOffset will be smaller than startOffset:
const startIndex = Math.min(range.startOffset, range.endOffset);
const { length } = String(selection);
const endIndex = startIndex + length;
p.textContent = p.textContent;
p.innerHTML = (
p.textContent.slice(0, startIndex) +
'<span class="highlighted">' +
selection +
'</span>' +
p.textContent.slice(endIndex)
);
});
.highlighted {
background-color: orange;
}
<p>sample text sample text sample text sample text sample text sample text sample text sample text sample text</p>
Если пользователь может выбрать более одной части текста за раз, и вы хотите выделить оба несмежных фрагмента текста, Вы можете перебирать диапазоны от 0 до selection.rangeCount
и выделять исходный контекст для создания нового HTML соответственно.