我正在使用 jQuery 1.5.1 和 Knockoutjs 2.0.0。我的情况有点复杂,但据我了解,这就是正在发生的事情:
我有一些绑定到 Knockoutjs 的元素也有 jQuery.live 绑定。其中一些绑定包含子(父?)选择器“>”。当我删除元素(使用 Knockout)时,我收到此错误:
未捕获的类型错误:无法读取 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
}
}
...
似乎 Knockout 在 jQuery 开始检查实时绑定之前从文档中删除元素,因此当最终检查元素时,它的父元素为空,并引发此错误。
我的问题:
人们会在哪里/如何建议我解决这个问题?我在想这样的事情:
var parent = elem.parentNode;
checkSet[i] = parent && parent.nodeName.toLowerCase() === part ? parent : false;
如果父级为空,似乎“>”选择器应该失败,但我可能错了。你们会怎么做?
更新:
JSFiddle 演示了该问题(尝试删除表格行):
仅当我将以下选择器之一用于我的 .live 绑定时,才会发生这种情况。在 :not 选择器中只使用一个类会导致错误消失。
'.grid:not(.anything, .anythingelse) > tbody > tr'
'.grid:not(.anything, .anythingelse) tbody > tr'