簡體   English   中英

如何通過Range對象和window.getSelection()獲取與body相關的Character偏移量?

[英]how can I get the Character offset related to body with Range Object and window.getSelection()?

我正在用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;
}

這看起來像我的一個答案中的函數。 我過分復雜了一點; 請參閱此答案,了解一個在IE <9中運行的更簡單的功能: https//stackoverflow.com/a/4812022/96100 您只需傳入document.body作為node參數即可。 另外,請閱讀鏈接答案中有關此方法缺點的部分。

這是一個現場演示: http//jsfiddle.net/PzQjA/

這是否已經“解決”了在內部文本而不是textContent中獲取caretOffset的方法?

通過雙擊選擇后,我有一個有效的解決方案......

在getSelection()周圍提取innerText的更好方法

還有更好的方法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM