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'