Как узнать, находится ли выделенный текст внутри определенного элемента - PullRequest
7 голосов
/ 01 декабря 2011

У меня есть два 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 ]

19 голосов
/ 01 декабря 2011

Функция 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;
}
0 голосов
/ 08 марта 2013

@ TimDown Всегда возвращает false независимо от того, находится он внутри 'узла' или нет

if ( (sel = document.selection) && sel.type != "Control") {
    return isOrContains(sel.createRange().parentElement(), el);
}
0 голосов
/ 01 декабря 2011

что-то вроде:

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;
}
0 голосов
/ 01 декабря 2011

вы можете наблюдать событие mouseup на каждом элементе div и привязывать к нему следующий метод:

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 возвращает пустую строку, вам следует сбросить начальную и конечную точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...