Мне нужно получить позицию курсора в div contentDditable. Я получаю полезную функцию от Get a range's start and end offset's relative to its parent container и https://stackoverflow.com/a/4770562/2008261.Как получить позицию курсора в contentEditable, содержащей HTML?
Но эти функции НЕ помогают, потому что мне нужна фактическая позиция в HTML, вот что мне нужно.
, если у меня есть:
<div id="diva" contenteditable="true">Insert <b>text here</b></div>
и я поставил курсор перед словом «текст» он возвращает 7, как это имеет дело с текстом. Но мне нужно, чтобы он возвращался 10, как будто он имеет дело с внутренним HTML-массивом div contentEditabe.
Эти функции я уже говорил ранее:
function getCaretCharacterOffsetWithin(element) {
var caretOffset = 0;
if (typeof window.getSelection != "undefined") {
var range = window.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
} else if (typeof document.selection != "undefined" && document.selection.type != "Control") {
var textRange = document.selection.createRange();
var preCaretTextRange = document.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}
И:
function getCharacterOffsetWithin(range, node) {
var treeWalker = document.createTreeWalker(
node,
NodeFilter.SHOW_TEXT,
function(node) {
var nodeRange = document.createRange();
nodeRange.selectNode(node);
return nodeRange.compareBoundaryPoints(Range.END_TO_END, range) < 1 ?
NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
},
false
);
var charCount = 0;
while (treeWalker.nextNode()) {
charCount += treeWalker.currentNode.length;
}
if (range.startContainer.nodeType == 3) {
charCount += range.startOffset;
}
return charCount;
}
Вы пытались использовать кросс-браузерную библиотеку, например [rangy] (https://code.google.com/p/rangy/)? –
@ VladMagdalin, rangy является удивительным. У меня было больше, чем мне нужно –