JQuery не поддерживает. есть в IE8?что такое работа? - PullRequest
5 голосов
/ 30 марта 2012

код: http://jsfiddle.net/4hV6c/4/ просто сделайте любой выбор, и вы получите ошибку сценария в ie8

Я пытаюсь сделать это:

$(end_node.parentNode).has(start_node)

, которыйв современных браузерах (chrome, ff, opera и т. д.) возвращает [], если start_node отсутствует в end_node.parentNode, и возвращает элемент (я забыл, какой), если он найден.

сейчас end_node является текстомelement, а parentNode - это фактическая сущность DOM.IE будет выполнять .has только на $(end_node).has(start_node), но это, очевидно, другое поведение.

Есть ли обходной путь, чтобы заставить это работать?

  • в IE скрипта выдаст ошибку,другие браузеры будут предупреждать вас логическим значением.

ОБНОВЛЕНИЕ: здесь есть слово, которое переопределяет .has () для моего конкретного сценария ... не уверен, работает ли он во всех случаях .has, поскольку я не знаю их всех.http://jsfiddle.net/8F57r/13/

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

Проблема в не jQuery

Запуск

console.log( $("div:has(span)").html() );
console.log( $("div").has($("span")[0]).html() );

Однако следующее выдает исключение http://jsfiddle.net/mendesjuan/4hV6c/8/

var textNode =  $("span")[0].childNodes[0];
$("div").has(textNode);

Чтоэто означает, что вы не можете передать текстовый узел в $.has.Вы должны отправить сообщение об ошибке в jQuery

В строке с ошибкой выдается следующее сообщение

No such interface supported jquery-1.7.1.js, line 5244 character 3

При попытке вызвать метод contains наузел.Это означает, что это действительно ошибка IE, с которой jQuery не работал.Я воспроизвел проблему без необходимости звонить $.has http://jsfiddle.net/4hV6c/10/

// This is broken in IE
var textNode =  $("span")[0].childNodes[0];
var divNode = $("div")[0];
divNode.contains(textNode);

Обходной путь http://jsfiddle.net/4hV6c/12/

function contains(outer, inner) {
   var current = inner;
    do {
        if (current == outer) {
           return true;
        }
    } while((current = current.parentNode) != document.body);

    return false;

}
rangy.init();

$(document).bind("mouseup", function() {
    var a = rangy.getSelection();
    start_node = a.anchorNode;
    end_node = a.focusNode;
    var b = a.getRangeAt(0);
    var c = b.commonAncestorContainer;
    b.selectNodeContents(c);
    a.setSingleRange(b);
    alert( contains( end_node.parentNode, start_node) );
});
1 голос
/ 30 марта 2012

Ты всегда мог сделать DIY?:) Я слышал, что рекурсивное дочернее индексирование работает очень быстро и довольно просто для реализации.

Смотрите здесь отличный учебник:

http://blog.swapnilsarwe.com/javascript-traversing-html-dom-recursively.html

0 голосов
/ 30 марта 2012

Находит ли делать то, что вы хотите?

rangy.init();

$(document).bind("mouseup", function() {
    var a = rangy.getSelection();
    start_node = a.anchorNode;
    end_node = a.focusNode;
    var b = a.getRangeAt(0);
    var c = b.commonAncestorContainer;
    b.selectNodeContents(c);
    a.setSingleRange(b);
    alert($(end_node.parentNode).find(start_node).length > 0);
});​
...