我正在尝试在包含嵌套节点的可编辑div中找到插入符号的选择索引。
示例(|是光标):
<div contenteditable="true">1234<span>5678|9</span></div> //Returns 4
我想要div中所有字符的索引,所以上面的例子应该返回8。
这就是我现在正在使用的。
var sel = window.getSelection();
return sel.anchorOffset;
我尝试过使用commonAncestor和其他选择&amp;范围方法,但我不确定如何找到它。
答案 0 :(得分:2)
穿越树! Here’s a demo.
function getSelectionOffsetFrom(parent) {
var sel = window.getSelection();
var current = sel.anchorNode;
var offset = sel.anchorOffset;
while(current && current !== parent) {
var sibling = current;
while(sibling = sibling.previousSibling) {
if(sibling.nodeType === 3) {
offset += sibling.nodeValue.length;
} else if(sibling.nodeType === 1) {
offset += getContentLength(sibling);
}
}
current = current.parentNode;
}
if(!current) {
return null;
}
return offset;
}
function getContentLength(element) {
var stack = [element];
var total = 0;
var current;
while(current = stack.pop()) {
for(var i = 0; i < current.childNodes.length; i++) {
if(current.childNodes[i].nodeType === 1) {
stack.push(current.childNodes[i]);
} else if(current.childNodes[i].nodeType === 3) {
total += current.childNodes[i].nodeValue.length;
}
}
}
return total;
}