1

我正在使用 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'
4

1 回答 1

1

当您将一个类传递给时,错误似乎消失的原因:not()是因为它随后成为一个有效的 CSS3 选择器,所以它被传递给querySelectorAll(),完全跳过了 Sizzle。有关详细信息,请参阅此问题

我不确定您所看到的行为是否是>Sizzle 的错误,如果是,是否已解决(从 jQuery 1.8 开始),但由于 CSS 选择器可以保证与规范一样接近浏览器可以保证,那么我只能建议使用您拥有的解决方法。

于 2012-08-23T19:58:45.337 回答