Как я могу получить смещение символов, связанных с телом с Range Object и window.getSelection ()? - PullRequest
4 голосов
/ 02 января 2012

Я пишу клиентское приложение с 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 ]

1 голос
/ 02 января 2012

Это похоже на функцию из одного из моих ответов.Я немного усложнил это;см. этот ответ для более простой функции, которая также работает в IE <9: <a href="https://stackoverflow.com/a/4812022/96100">https://stackoverflow.com/a/4812022/96100. Вы можете просто передать document.body в качестве параметра node.Также, пожалуйста, прочитайте часть в связанном ответе о недостатках этого подхода.

Вот живая демонстрация: http://jsfiddle.net/PzQjA/

0 голосов
/ 24 октября 2014

Было ли это "решено" таким образом, чтобы получить значение caretOffset внутри innerText, а не textContent?

У меня есть решение, которое работает, после двойного щелчка выбора ...

Лучший способ извлечь innerText вокруг getSelection ()

Есть ли даже лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...