更新
我写了一个更简单的版本,也适用于IE <9:
旧答案
这实际上是一个比整个文档的文本中的字符偏移更有用的结果:DOM范围的 startOffset 属性(这是 window.getSelection().getRangeAt() 返回的)是相对于其 startContainer 属性的偏移量(这不是't necessarily always a text node, by the way). However, if you really want a character offset, here' sa将执行的操作它 .
这是功能:
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;
}