如何知道所选文本是否在特定div中

时间:2011-12-01 10:31:28

标签: javascript html dom

我有两个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及更高版本中运行。

4 个答案:

答案 0 :(得分:19)

下面的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;
}

答案 1 :(得分:0)

你可以在每个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方法返回一个空字符串,则应重置start-和endpoint。

答案 2 :(得分:0)

类似的东西:

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;
}

答案 3 :(得分:0)

@TimDown无论是否在'node'内,它总是返回false

if ( (sel = document.selection) && sel.type != "Control") {
    return isOrContains(sel.createRange().parentElement(), el);
}