jQuery 1.5.1 Sizzle'无法读取属性nodename'child'>'

jQuery 1.5.1 Sizzle 'cannot read property nodename' child '>' selector with knockoutjs

本文关键字:属性 nodename child 读取 gt jQuery Sizzle      更新时间:2023-09-26

我使用的是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开始检查活动绑定之前从文档中删除元素,所以当最终检查元素时,它的父元素为null,并抛出此错误。

我的问题:

人们会建议我在哪里/如何解决这个问题?我在想这样的事情:

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

如果父项为null,">"选择器似乎应该失败,但我可能错了。你们会怎么做?

更新:

JSFiddle演示问题(尝试删除表行):

只有当我使用下面的选择器之一进行.live绑定时,才会发生这种情况。在:not选择器中只使用一个类会导致错误消失。

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

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

我不确定你在>中看到的行为是否是Sizzle的错误,如果是的话,它是否已经得到了解决(从jQuery 1.8开始),但由于CSS选择器保证能像浏览器所承诺的那样接近规范,所以我只能建议使用你现有的解决方法。