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: 好像连最新版的jQuery uses the same code. 是的,我已经想到了。应该提到它,谢谢马特和里奇。 好的。有一个新的 Sizzle 引擎,所以这可能是一种可能性。那样的话,我不知道! FWIW,jQuery 1.8b1 仍然发生这种情况,但从那以后出现了 Sizzle “大量重写”,today's 1.8b2 解决了这个问题 【参考方案1】:当您将一个类传递给:not()
时,该错误似乎消失的原因是因为它变成了一个有效的CSS3 选择器,所以它被传递给querySelectorAll()
,完全跳过了Sizzle。详情请见this question。
我不确定您在 >
中看到的行为是否是 Sizzle 的错误,如果是,是否已解决(从 jQuery 1.8 开始),但因为 CSS 选择器保证可以作为接近规范,因为浏览器可以承诺,那么我只能建议使用您拥有的解决方法。
【讨论】:
以上是关于jQuery 1.5.1 Sizzle 'cannot read property nodename' child '>' selector with knockoutjs的主要内容,如果未能解决你的问题,请参考以下文章
jQuery/Sizzle checkContext 内存泄漏
:nth-of-type() 在 jQuery / Sizzle 中?