1

jQuery 1.5.1 と Knockoutjs 2.0.0 を使用しています。私の状況は少し複雑ですが、私が理解しているように、次のことが起こっています。

jQuery.liveバインディングも持つKnockoutjsにバインドされた要素がいくつかあります。これらのバインディングの一部には、子 (親?) セレクター「>」が含まれています。(Knockout を使用して) 要素を削除すると、次のエラーが発生します。

キャッチされていない TypeError: null のプロパティ 'nodeName' を読み取れません

jQuery の次のコードによってスローされます。

">": function (checkSet, part) {
  ...    
    for (; i < l; i++) {
      elem = checkSet[i];

      if (elem) {
        var parent = elem.parentNode;
        checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
        //Uncaught TypeError: Cannot read property 'nodeName' of null
      }
    }
 ...

jQuery がライブ バインディングをチェックする前に Knockout がドキュメントから要素を削除しているように見えるため、要素が最終的にチェックされるとその親が null になり、このエラーがスローされます。

私の質問:

これをどこで/どのように修正することをお勧めしますか? 私は次のようなことを考えていました:

var parent = elem.parentNode;
checkSet[i] = parent && parent.nodeName.toLowerCase() === part ? parent : false;

親がnullの場合、「>」セレクターは失敗するはずですが、それについては間違っている可能性があります。あなたたちはどうしますか?

アップデート:

問題を示す JSFiddle (テーブルの行を削除してみてください):

これは、以下のセレクターの 1 つを .live バインディングに使用した場合にのみ発生します。:not セレクターで 1 つのクラスのみを使用すると、バグが消えます。

'.grid:not(.anything, .anythingelse) > tbody > tr'
'.grid:not(.anything, .anythingelse) tbody > tr'
4

1 に答える 1

1

1 つのクラスを に渡すとバグが消えるように見える理由:not()は、それが有効な CSS3 セレクターになるためですquerySelectorAll()。詳細については、この質問を参照してください。

表示されている動作が>Sizzle のバグであるかどうか、また、そうである場合は (jQuery 1.8 の時点で) 対処されているかどうかはわかりませんが、CSS セレクターは仕様にできるだけ近い形で動作することが保証されているためです。ブラウザが約束できる場合は、あなたが持っている回避策の使用を提案することしかできません。

于 2012-08-23T19:58:45.337 に答える