JSFiddle - React, Tailwind, and code Playground
by xalvin11
HTML
<div>
<p>1st content</p>
<p>2nd content</p>
<p>3rd content</p>
<p>4th content</p>
<p>5th content</p>
<p>6th content</p>
<p>7th content</p>
<p>8th content</p>
<p>9th content</p>
</div>
sadsadasd
<button onclick="highlight()">Highlight</button>
CSS
.highlight {
background-color: #FFCCCC;
font-weight: bold;
}
JavaScript
console.clear();
function highlight() {
console.clear();
var range = window.getSelection().getRangeAt(0),
parent = range.commonAncestorContainer,
start = range.startContainer,
end = range.endContainer;
var startDOM = (start.parentElement == parent) ? start.nextSibling : start.parentElement;
var currentDOM = startDOM.nextElementSibling;
var endDOM = (end.parentElement == parent) ? end : end.parentElement;
//Process Start Element
highlightText(startDOM, 'START', range.startOffset);
while (currentDOM != endDOM && currentDOM != null) {
highlightText(currentDOM);
currentDOM = currentDOM.nextElementSibling;
}
//Process End Element
highlightText(endDOM, 'END', range.endOffset);
}
function highlightText(elem, offsetType, idx) {
if (elem.nodeType == 3) {
var span = document.createElement('span');
span.setAttribute('class', 'highlight');
var origText = elem.textContent, text, prevText, nextText;
if (offsetType == 'START') {
text = origText.substring(idx);
prevText = origText.substring(0, idx);
} else if (offsetType == 'END') {
text = origText.substring(0, idx);
nextText = origText.substring(idx);
} else {
text = origText;
}
span.textContent = text;
var parent = elem.parentElement;
parent.replaceChild(span, elem);
if (prevText) {
var prevDOM = document.createTextNode(prevText);
parent.insertBefore(prevDOM, span);
}
if (nextText) {
var nextDOM = document.createTextNode(nextText);
//parent.appendChild(nextDOM);
parent.insertBefore(nextDOM, span.nextSibling);
//parent.insertBefore(span, nextDOM);
}
return;
}
var childCount = elem.childNodes.length;
for (var i = 0; i < childCount; i++) {
if (offsetType ==...