【问题标题】:How can I get the DOM element which contains the current selection?如何获取包含当前选择的 DOM 元素?
【发布时间】:2010-11-23 01:03:13
【问题描述】:

您可以用鼠标选择网页的一部分。

我知道我可以获取currently selected text,但我如何获取包含当前选择的开始或结束的 DOM 元素?

【问题讨论】:

    标签: javascript html dom selection


    【解决方案1】:

    以下将返回当前选择的开始或结束边界的容器元素,使用布尔值isStart 来指定是否需要开始或结束边界。它适用于大多数主流浏览器。添加功能测试以提高稳健性。

    function getSelectionBoundaryElement(isStart) {
        var range, sel, container;
        if (document.selection) {
            range = document.selection.createRange();
            range.collapse(isStart);
            return range.parentElement();
        } else {
            sel = window.getSelection();
            if (sel.getRangeAt) {
                if (sel.rangeCount > 0) {
                    range = sel.getRangeAt(0);
                }
            } else {
                // Old WebKit
                range = document.createRange();
                range.setStart(sel.anchorNode, sel.anchorOffset);
                range.setEnd(sel.focusNode, sel.focusOffset);
    
                // Handle the case when the selection was selected backwards (from the end to the start in the document)
                if (range.collapsed !== sel.isCollapsed) {
                    range.setStart(sel.focusNode, sel.focusOffset);
                    range.setEnd(sel.anchorNode, sel.anchorOffset);
                }
           }
    
            if (range) {
               container = range[isStart ? "startContainer" : "endContainer"];
    
               // Check if the container is a text node and return its parent if so
               return container.nodeType === 3 ? container.parentNode : container;
            }   
        }
    }
    

    【讨论】:

    • 如果我想获得整个选择的父级怎么办?这可能吗?
    • 我正在查看该代码并尝试了它,非常好。但是如果选择了 2,它就不能返回两个元素。
    【解决方案2】:

    在 IE 中使用 document.selection.createRange().parentElement(),在真实浏览器中使用 window.getSelection().getRangeAt(0).startContainer.parentNode。像这样的:

    function getSelectedNode()
    {
        if (document.selection)
            return document.selection.createRange().parentElement();
        else
        {
            var selection = window.getSelection();
            if (selection.rangeCount > 0)
                return selection.getRangeAt(0).startContainer.parentNode;
        }
    }
    

    【讨论】:

    • 这将在浏览器之间给出不一致的结果,并且不回答原始问题。在 IE 中,您将获得包含整个选择的元素,而在其他浏览器中,您将获得包含选择开始的节点的父节点(可能是文本节点或元素)。
    • 此解决方案不适用于所有情况。如果您尝试选择多个标签,则除了第一个标签之外的所有后续标签都将被忽略。更通用的解决方案在这里:stackoverflow.com/a/5222955/1844247
    猜你喜欢
    • 2011-02-01
    • 2017-10-12
    • 2014-02-13
    • 2016-08-02
    • 2020-04-21
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多