2

我正在做一个 jQuery 多选择器查找:

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

在 Chrome 版本 1 中,它在jquery 的 selector.js 的第 722 行给出了这个错误“INVALID_NODE_TYPE_ERR:DOM Range Exception 2”

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 测试版中(可能是因为它实现了selector.js#703document.documentElement.compareDocumentPosition ,所以它从来没有遇到过这个代码)。

为了解决这个问题,我用四个单选替换了多选器,我将它们合并在一起,效果很好,但它真的很难看:

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

这真的是解决这个问题的唯一方法,还是我能做些什么?

更新在 Sizzle 讨论论坛上有一个关于此的线程,已经发布了 Sizzle(jQuery 选择器)代码的可能补丁,这可能会进入 jquery 核心。在动态代码上执行多个选择器时,这似乎只是一个问题

4

3 回答 3

1

如果问题出在网络浏览器上,那么遗憾的是,您只能等待更新,或者使用多个选择器并合并结果集。从它的外观来看,这根本不会对性能造成很大的影响,因此我不会担心。

于 2009-04-21T01:44:10.287 回答
0

你有没有尝试过...

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

?

于 2009-04-21T02:12:12.217 回答
0

作为参考,整个 DOM 和渲染只是 Apple 的 WebKit,所以你看到的任何错误都应该报告给http ://bugs.webkit.org——Chrome 没有自己独特的引擎。

于 2009-04-21T03:41:09.037 回答