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 の隠し入力フィールドです。私が見つけたところによると、このエラーは Chrome の新しいベータ版では発生しないため、古い Webkit バージョンの問題のようです(おそらく、 selector.js#703document.documentElement.compareDocumentPositionを実装しているため、このコードにヒットしないためです)。

この問題を回避するために、マルチセレクターを 4 つの単一選択に置き換えました。これらをマージすると正常に動作しますが、実際には醜いです:

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

問題が Web ブラウザーにある場合は、残念ながら、更新を待つか、複数のセレクターを使用して結果セットをマージする以外にできることはありません。どう見ても、これは大きなパフォーマンス ヒットにはならないので、心配する必要はありません。

于 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 に答える