【问题标题】:How to know if selected text is inside a specific div如何知道选定的文本是否在特定的 div 内
【发布时间】:2012-01-10 12:14:39
【问题描述】:

我有两个 div,如下所示:

<div id="div1">
<p>something</p>
<div><table><tr><td>Div1</td></tr></table></div>
</div>
<div id="div2">
<p>something else</p>
<div><table><tr><td>Div2</td></tr></table></div>
</div>
<button type="button">Check</button>

现在,我想知道何时选择了某些文本,然后按下了按钮,选择的文本是否在“div1”下。我该怎么做?

编辑:并且该解决方案必须在 IE-7 及更高版本中工作。

【问题讨论】:

    标签: javascript html dom


    【解决方案1】:

    下面的elementContainsSelection() 函数返回一个布尔值,表示指定元素是否包含用户的全部选择,并且适用于所有主流浏览器,包括 IE 6。

    现场演示:http://jsfiddle.net/eT8NQ/

    代码:

    function isOrContains(node, container) {
        while (node) {
            if (node === container) {
                return true;
            }
            node = node.parentNode;
        }
        return false;
    }
    
    function elementContainsSelection(el) {
        var sel;
        if (window.getSelection) {
            sel = window.getSelection();
            if (sel.rangeCount > 0) {
                for (var i = 0; i < sel.rangeCount; ++i) {
                    if (!isOrContains(sel.getRangeAt(i).commonAncestorContainer, el)) {
                        return false;
                    }
                }
                return true;
            }
        } else if ( (sel = document.selection) && sel.type != "Control") {
            return isOrContains(sel.createRange().parentElement(), el);
        }
        return false;
    }
    

    【讨论】:

      【解决方案2】:

      您可以在每个 div 上观察 mouseup 事件,并将以下方法绑定到它:

      var endpoint = null
      function getselected(event){
        endpoint = event.target;
        var t = '';
        if(window.getSelection){
          t = window.getSelection();
        }else if(document.getSelection){
          t = document.getSelection();
        }else if(document.selection){
          t = document.selection.createRange().text;
        }
        return t;
      }
      

      然后此方法将返回选定的文本,它会告诉您选择过程在触发事件的 div 上结束。如果您需要起点,则必须将 mousedown 事件绑定到 div,这会将元素 id 存储在变量中,因此您可以确定选择过程的起点和终点,并找出介于两者之间的 div。

      var startpoint = null;
      function beginSelection(event){
        startpoint = event.target;
      }
      

      如果 getSelected-method 返回一个空字符串,您应该重置 start- 和 endpoint。

      【讨论】:

        【解决方案3】:

        类似:

        function checkSelection() {
            function checkNode(node) {
                do {
                    if(node.id == "div1")
                        return true;
                } while(node = node.parentNode);
        
                return false;
            }
        
            if(window.getSelection) {
                var selection = window.getSelection();
                for(var i = 0, l = selection.rangeCount; i < l; i++) {
                    var range = selection.getRangeAt(i), start = range.startContainer, end = range.endContainer;
                    if(checkNode(start) || (start != end && checkNode(end)))
                        return true;
                }
            }
        
            if(window.scelection && window.selection.createRange) {
                var range = window.selection.createRange();
                if(range)
                    return checkNode(range.parentElement());
            }
        
            return false;
        }
        

        【讨论】:

        • 浏览器不支持window.getSelection()怎么办;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 2017-09-18
        • 2013-04-29
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        相关资源
        最近更新 更多