javascript - 如何在 contenteditable 中获取所选文本的开始位置和结束位置?

标签 javascript contenteditable

这个问题对我来说很重要。

我有这个元素:

<div class="title">
    Hello Every thig is<span style="font-family: Tahoma;font-size: 20px">Good ! </span>
</div>

如何获取选中文本的开始位置和结束位置?

这是我的代码。它在父元素没有任何子元素时起作用。

    var selectedRange = window.getSelection().getRangeAt(0);
    var selectedNode = selectedRange.commonAncestorContainer;
    console.log("selected node: ", selectedNode);
    console.log(selectedRange.anchorNode)
    console.log("selected node value: ", selectedNode.nodeValue);
    console.log("selection chars range: START POS: ", selectedRange.startOffset);
    console.log("selection chars range: END POS: ", selectedRange.endOffset);

感谢您的帮助。

最佳答案

哦,天哪,范围处理一直是……头疼的问题!试试这个(用 Chrome 测试过):

        var selection = function () {
            var selectedRange = window.getSelection().getRangeAt(0);
            if(selectedRange)
            {
                var sc = selectedRange.startContainer,
                so = selectedRange.startOffset,
                ec = selectedRange.endContainer,
                eo = selectedRange.endOffset;
                var editable = document.getElementById('editor');
                var start = rootOffset(editable, { node: sc, offset: so });
                var end = rootOffset(editable, { node: ec, offset: eo });
                console.log(start.offset);
                console.log(end.offset);
            }
        };

        var rootOffset = function (root, point) {
            if (point.node === root)
            {
                return point;
            }
            var previousSibling = point.node.previousSibling;
            if (previousSibling) {
                return {
                    node: point.node,
                    offset: rootOffset(root, {
                        node: previousSibling,
                        offset: nodeLength(previousSibling)
                    }).offset + point.offset
                };
            }
            else
            {
                var parentNode = point.node.parentNode;
                if(parentNode)
                {
                    return rootOffset(root, { node: parentNode, offset: point.offset });
                }
            }
            return point;
        };

        var isText = function (node) {
            return node && node.nodeType === 3;
        };

        var nodeLength = function (node) {
            if (isText(node)) {
                return node.nodeValue.trim().length;
            }
            var length = 0;
            var childNodes = node.childNodes;
            if (childNodes)
            {
                for(var i = 0; i < childNodes.length; i++)
                {
                    length += nodeLength(childNodes[i]);
                }
            }
            return length;
        };
    <div id="editor" contenteditable="true">
        <div class="title">Hello Every thing is<span style="font-family: Tahoma;font-size: 20px">Good ! </span>
        </div>
    </div>
    <button type="button" id="btnLog" onclick="selection();">Log Selection</button>

关于javascript - 如何在 contenteditable 中获取所选文本的开始位置和结束位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882466/

相关文章:

javascript - 如何将查询过滤器添加到迭代跟踪板?

JavaScript 事件仅循环一次且无输出

javascript - 在特定类 JQuery 之后添加行

javascript - Vue.js v-html contenteditable 防止 dom 刷新以防止光标/插入符跳转

javascript - 获取插入符位置的元素节点(在 contentEditable 中)

javascript - 如何删除 contenteditable 中元素的尾随空格?

javascript - 使用 JavaScript 比较 2 个数组并创建一个新的对象数组,该数组不包含 id 字段匹配的对象

javascript - 使用动态名称访问对象中的元素

javascript - 禁止 HTML anchor 标记内插入符号

javascript - HTML 可编辑表 : Add new row including radio buttons