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

Posted

技术标签:

【中文标题】jQuery 1.5.1 Sizzle \'cannot read property nodename\' child \'>\' selector with knockoutjs【英文标题】:jQuery 1.5.1 Sizzle 'cannot read property nodename' child '>' selector with knockoutjsjQuery 1.5.1 Sizzle 'cannot read property nodename' child '>' selector with knockoutjs 【发布时间】:2012-07-09 22:04:07 【问题描述】:

我正在使用 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 demonstrating the issue(尝试删除表格行):

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

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

【问题讨论】:

@RichBradshaw: 好像连最新版的jQu​​ery uses the same code. 是的,我已经想到了。应该提到它,谢谢马特和里奇。 好的。有一个新的 Sizzle 引擎,所以这可能是一种可能性。那样的话,我不知道! FWIW,jQuery 1.8b1 仍然发生这种情况,但从那以后出现了 Sizzle “大量重写”,today's 1.8b2 解决了这个问题 【参考方案1】:

当您将一个类传递给:not() 时,该错误似乎消失的原因是因为它变成了一个有效的CSS3 选择器,所以它被传递给querySelectorAll(),完全跳过了Sizzle。详情请见this question。

我不确定您在 &gt; 中看到的行为是否是 Sizzle 的错误,如果是,是否已解决(从 jQuery 1.8 开始),但因为 CSS 选择器保证可以作为接近规范,因为浏览器可以承诺,那么我只能建议使用您拥有的解决方法。

【讨论】:

以上是关于jQuery 1.5.1 Sizzle 'cannot read property nodename' child '>' selector with knockoutjs的主要内容,如果未能解决你的问题,请参考以下文章

jQuery中的Sizzle引擎分析

JQuery选择器Sizzle词法分析器的理解

jQuery/Sizzle checkContext 内存泄漏

:nth-of-type() 在 jQuery / Sizzle 中?

C# 中是不是有 Sizzle/jQuery 选择器实现? [关闭]

JQuery Sizzle引擎源代码分析