JSFiddle - React, Tailwind, and code Playground
by Tân Nguyễn
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/rangy/1.3.0/rangy-core.min.js"></script>
<div contenteditable>Hello world!</div>
CSS
div {
border: 1px solid;
}
JavaScript
var selector = document.querySelector('[contenteditable]');
var setCaretIndex = function (index) {
var charIndex = 0, stop = {};
var traverseNodes = function (node) {
if (node.nodeType === 3) {
var nextCharIndex = charIndex + node.length;
if (index >= charIndex && index <= nextCharIndex) {
rangy.getSelection().collapse(node, index - charIndex);
throw stop;
}
charIndex = nextCharIndex;
}
// Count an empty element as a single character. The list below may not be exhaustive.
else if (node.nodeType === 1 && /^(input|br|img|col|area|link|meta|link|param|base)$/i.test(node.nodeName)) {
charIndex += 1;
} else {
var child = node.firstChild;
while (child) {
traverseNodes(child);
child = child.nextSibling;
}
}
};
try {
traverseNodes(selector);
} catch (ex) {
if (ex !== stop) throw ex;
}
};
selector.focus();
setCaretIndex(3);