如何通过Range对象和window.getSelection()获取与body相关的Character偏移量?

时间:2012-01-02 07:01:51

标签: javascript range

我正在用Javascript编写客户端应用程序,我正在使用以下函数:

function creation() {
var userSelection;
if (window.getSelection) {
    userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
    userSelection = document.selection.createRange();
}

var rangeObject = getRangeObject(userSelection);
var startOffset = rangeObject.startOffset;
var endOffset = rangeObject.endOffset;
var startCon = rangeObject.startContainer;
var endCon = rangeObject.endContainer;
var myRange = document.createRange();
myRange.setStart(startCon,rangeObject.startOffset);
myRange.setEnd(endCon, rangeObject.endOffset);
$('#result').text(myRange.toString());
}

function getRangeObject(selectionObject) {
if (selectionObject.getRangeAt) {
    var ret = selectionObject.getRangeAt(0);
    return ret;
}
else { // Safari!
    var range = document.createRange();
    range.setStart(selectionObject.anchorNode, selectionObject.anchorOffset);
    range.setEnd(selectionObject.focusNode, selectionObject.focusOffset);
    return range;
     }
}

我需要一种方法来了解与body元素相关的字符偏移量。我找到了一个函数来计算元素中的字符:

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;
}

2 个答案:

答案 0 :(得分:1)

这看起来像我的一个答案中的函数。我过分复杂了一点;看到这个答案的更简单的功能,适用于IE&lt; 9以及:https://stackoverflow.com/a/4812022/96100。您只需将document.body作为node参数传递即可。另外,请阅读链接答案中有关此方法缺点的部分。

这是一个现场演示:http://jsfiddle.net/PzQjA/

答案 1 :(得分:0)

这是否已经解决了#34;在某种方式来获取innerText内的caretOffset而不是textContent?

通过双击选择后,我找到了一个有效的解决方案......

A better way to extract innerText around getSelection()

还有更好的方法吗?