document.getElementById("move").addEventListener("click", function() {
onLoad(+document.getElementById("get-index").value);
});
function onLoad(index) {
// remove old bookmark
var bookmark = document.getElementById("bookmark-pointer");
if (bookmark) bookmark.remove();
var textNode;
// Loop through all the text nodes and sum up their lengths, once the sum is bigger than the index, get that node
Array.prototype.some.call(document.querySelectorAll("#article *"), function(dom) {
return textNode = Array.prototype.find.call(dom.childNodes, function(node) {
if (node.nodeType !== 3) return false;
if (index >= node.textContent.length) return index -= node.textContent.length, false;
return true;
});
});
if (!textNode) throw Error("Index out of bounds");
bookmark = document.createElement("div");
bookmark.id = "bookmark-pointer";
// Split the node based on the remaining index and add the bookmark in the middle
var nextNode = textNode.nextSibling;
insertBefore(textNode.parentElement, document.createTextNode(textNode.textContent.substring(0, index)), nextNode);
insertBefore(textNode.parentElement, bookmark, textNode);
insertBefore(textNode.parentElement, document.createTextNode(textNode.textContent.substring(index)), nextNode);
textNode.remove();
// Wait for the changes to be rendered and then scroll to the bookmark
setTimeout(function() {
scrollTo(0, bookmark.offsetTop);
}, 0);
}
function insertBefore(parentElement, newNode, referenceNode) {
if (referenceNode) parentElement.insertBefore(newNode, referenceNode);
else parentElement.appendChild(newNode);
}
#bookmark-pointer {
display: inline;
}
<input id="get-index" type="number" placeholder="Type Index here">
<button id="move">Go</button>
<div id="article"><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec malesuada urna, eget egestas orci. Quisque gravida justo nunc, sit amet blandit risus tempus a. Integer justo justo, luctus non porttitor et, porta ut neque. Sed elit dui, ornare vitae mi</div><div>et, posuere vestibulum ex. Aliquam erat volutpat. Donec tempor dolor ligula, at consequat dui egestas id. Proin sem lorem, molestie ac imperdiet egestas, tincidunt nec leo. Phasellus sed laoreet mi. Suspendisse non neque ut turpis venenatis pulvinar.</div><div>Vestibulum egestas magna ullamcorper ligula ultrices, quis pretium sem venenatis. Etiam volutpat vel diam posuere pharetra. Donec eget commodo leo.</div><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec malesuada urna, eget egestas orci. Quisque gravida justo nunc, sit amet blandit risus tempus a. Integer justo justo, luctus non porttitor et, porta ut neque. Sed elit dui, ornare vitae mi</div><div>et, posuere vestibulum ex. Aliquam erat volutpat. Donec tempor dolor ligula, at consequat dui egestas id. Proin sem lorem, molestie ac imperdiet egestas, tincidunt nec leo. Phasellus sed laoreet mi. Suspendisse non neque ut turpis venenatis pulvinar.</div><div>Vestibulum egestas magna ullamcorper ligula ultrices, quis pretium sem venenatis. Etiam volutpat vel diam posuere pharetra. Donec eget commodo leo.</div><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec malesuada urna, eget egestas orci. Quisque gravida justo nunc, sit amet blandit risus tempus a. Integer justo justo, luctus non porttitor et, porta ut neque. Sed elit dui, ornare vitae mi</div><div>et, posuere vestibulum ex. Aliquam erat volutpat. Donec tempor dolor ligula, at consequat dui egestas id. Proin sem lorem, molestie ac imperdiet egestas, tincidunt nec leo. Phasellus sed laoreet mi. Suspendisse non neque ut turpis venenatis pulvinar.</div><div>Vestibulum egestas magna ullamcorper ligula ultrices, quis pretium sem venenatis. Etiam volutpat vel diam posuere pharetra. Donec eget commodo leo.</div><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec malesuada urna, eget egestas orci. Quisque gravida justo nunc, sit amet blandit risus tempus a. Integer justo justo, luctus non porttitor et, porta ut neque. Sed elit dui, ornare vitae mi</div><div>et, posuere vestibulum ex. Aliquam erat volutpat. Donec tempor dolor ligula, at consequat dui egestas id. Proin sem lorem, molestie ac imperdiet egestas, tincidunt nec leo. Phasellus sed laoreet mi. Suspendisse non neque ut turpis venenatis pulvinar.</div><div>Vestibulum egestas magna ullamcorper ligula ultrices, quis pretium sem venenatis. Etiam volutpat vel diam posuere pharetra. Donec eget commodo leo.</div></div>