我如何使用javascript获取&使用字符偏移设置插入位置?

时间:2013-12-10 06:16:32

标签: javascript

有没有办法使用javascript来获取&使用字符偏移量(相对于文档的开头)设置插入位置?

在我的情况下,由于许多原因,使用的首选值是字符偏移而不是dom节点。有一个相当快(没有明显的时间)的方法来实现这一目标吗?我宁愿将任何'p'标签视为字符('\ n'),但如果这使得解决方案无法解决,则忽略它们就可以。

编辑: 由于它显然令人困惑,我问的是一个插入符号,因为有一个插入符号。不是因为没有。 [那些不了解contentEditable的人无论如何也没有机会回答这个问题,所以我认为没有必要解释]。因为我应该证明我曾尝试但不知道我问的问题的解决方案(为什么我会问,我想知道?),这是我能够解决的最佳尝试。它没有给出正确答案。

编辑: 它现在给出了正确的答案;唯一的问题是,如果有一些javascript方法或更简单,更快的方法。

编辑: 修正了在换行后选择结束时给出正确答案。

        function nodeOffset(findnode) {
            var offset = 0;
            var root = document.body
            var node = root.childNodes[0];
            while(node != null) {
                if(node.nodeType == 3) {
                    if(node == findnode)
                        return offset;
                    offset += node.length; //text
                } else if (node.tagName == 'P') {
                    offset += 1; //newline character
                    if(node == findnode)
                        return offset;
                }
                if(node.hasChildNodes()) {
                    node = node.firstChild;
                } else {
                    while(node.nextSibling == null && node != root) {
                        node = node.parentNode;
                    }
                node = node.nextSibling;
                }
            }
        }

        var selection = window.getSelection();
        var offset = nodeOffset(selection.focusNode) + selection.focusOffset;

1 个答案:

答案 0 :(得分:0)

蛮力方法。 (它很有可能绊倒,例如,如果其他代码为display:blockp不是display:block,或其他可能的问题):

获取选择插入符/锚点偏移量,它可以是同一个:

        function nodeOffset(findnode) {
            var offset = 0;
            var root = document.body
            var node = root.childNodes[0];
            while(node != null) {
                if(node.nodeType == 3) {
                    if(node == findnode)
                        return offset;
                    offset += node.length; //text
                } else if (node.tagName == 'P') {
                    offset += 1; //newline character
                    if(node == findnode)
                        return offset;
                }
                if(node.hasChildNodes()) {
                    node = node.firstChild;
                } else {
                    while(node.nextSibling == null && node != root) {
                        node = node.parentNode;
                    }
                node = node.nextSibling;
                }
            }
        }

        var selection = window.getSelection();
        var focusoffset = nodeOffset(selection.focusNode)+selection.focusOffset;
        var anchoroffset = nodeOffset(selection.anchorNode)+selection.anchorOffset;

要设置插入符号/锚点偏移量,尽管它们必须按最小 - >最大的顺序排列,而不能选择哪个是焦点和最大值。哪个是锚:

        function offsetNode(findoffset) {
            var offset = 0;
            var root = document.body
            var node = root.childNodes[0];
            while(node != null) {
                if(node.nodeType == 3) {
                    offset += node.length; //text
                    if(offset >= findoffset)
                        return [node, findoffset-offset+node.length];
                } else if (node.tagName == 'P') {
                    offset += 1; //newline character
                }
                if(node.hasChildNodes()) {
                    node = node.firstChild;
                } else {
                    while(node.nextSibling == null && node != root) {
                        node = node.parentNode;
                    }
                node = node.nextSibling;
                }
            }
        }

        var selection = window.getSelection();
        var range = document.createRange();
        var start = offsetNode(startoffset)
        var end = offsetNode(endoffset)
        range.setStart(start[0], start[1]);
        range.setEnd(end[0], end[1]);
        selection.removeAllRanges();
        selection.addRange(range);