INVALID_NODE_TYPE_ERR в jQuery при выполнении нескольких селекторов в Chrome

Я выполняю поиск нескольких селекторов jQuery:

element.find("fieldset, input[type=hidden], input[type=text], :radio")

а в версии Chrome 1 выдает эту ошибку «INVALID_NODE_TYPE_ERR: DOM Range Exception 2» на строка 722 jquery selector.js

aRange.selectNode(a);

в контексте:

function(a, b) {
    var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
    aRange.selectNode(a);
    aRange.collapse(true);
    bRange.selectNode(b);
    bRange.collapse(true);
    var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
    if (ret === 0) {
        hasDuplicate = true;
    }
    return ret;
}

в данном случае a - это скрытое поле ввода HTML. Насколько я могу судить, это кажется проблемой со старой версией webkit, поскольку эта ошибка не возникает в новой бета-версии Chrome (вероятно, потому, что она никогда не попадает в этот код, потому что он реализует document.documentElement.compareDocumentPosition см. selector.js # 703).

Чтобы обойти эту проблему, я заменил мультиселектор четырьмя одиночными выделениями, которые я объединяю вместе, что отлично работает, но это действительно уродливо:

elements = element.find('fieldset')
.add(element.find('input[type=hidden]'));
.add(element.find('input[type=text]'));
.add(element.find(':radio'));

Это действительно единственный способ обойти эту проблему или я могу еще что-то сделать?

ОБНОВЛЕНИЕ. Об этом есть ветка об этом в обсуждении Sizzle. forum, был опубликован возможный патч для кода Sizzle (селектор jQuery), он может попасть в ядро ​​jquery. Кажется, это проблема только при использовании множественного селектора в динамическом коде.


person Glenn Slaven    schedule 21.04.2009    source источник
comment
это происходит и в других браузерах?   -  person matt b    schedule 21.04.2009
comment
Не то, чтобы я знал, но в настоящее время я не могу протестировать в Safari на Mac, но если это проблема в webkit, я могу предположить, что это тоже происходит там   -  person Glenn Slaven    schedule 22.04.2009


Ответы (3)


Если проблема заключается в веб-браузере, то, к сожалению, вы ничего не можете сделать, кроме как дождаться обновления или использовать несколько селекторов и объединить наборы результатов. Судя по тому, как это выглядит, это вообще не будет большим ударом по производительности, и поэтому я бы не стал об этом беспокоиться.

person Scott M.    schedule 21.04.2009
comment
Это была моя мысль, я просто надеялся, что есть менее уродливый способ сделать это - person Glenn Slaven; 22.04.2009

Ты пытался...

element.find(['fieldset', 'input[type=hidden]', 'input[type=text]', ':radio'])

?

person Matt    schedule 21.04.2009
comment
К сожалению, это ничего не возвращает :( - person Glenn Slaven; 22.04.2009

Для справки, вся модель DOM и рендеринг - это просто Apple WebKit, поэтому обо всех обнаруженных вами ошибках следует сообщать по адресу http://bugs.webkit.org - Chrome не имеет собственного уникального движка.

person olliej    schedule 21.04.2009