为什么* 表现得像:使用jQuery的过滤方法时检查过?

继上一个问题之后 。
可以说我在装有jQuery 1.5.2的页面上有两个复选框

  

然后让我们点击它们以给每个被checked属性。 现在让我们抓住所有复选框并过滤掉未选中的复选框

 var numOfCheckedBoxes = $("input:checkbox").filter("*[checked]").size(); 

现在根据上一个问题的答案,我希望numOfCheckedBoxes等于0但它等于2 。 我现在应该使用$("input:checkbox:checked")$("input:checkbox").filter(":checked")

这与我不同

 var numOfCheckedBoxes = $("#test1").filter("*[checked]").size(); 

numOfCheckedBoxes设置为0
这是第一个有问题的场景的jsFiddle。 这是第二个问题的jsFiddle。

因为在现代浏览器中,DOM选择将使用querySelectorAll完成。

这意味着在进行DOM选择时, *[checked]实际上会查找该特定属性。

当您在DOM选择中执行':checked'时,您使用的是无效CSS的Sizzle扩展,因此不使用querySelectorAll ,因此使用Sizzle ,它会查看属性以及属性。


所以这里的区别在于.filter()没有/不能使用querySelectorAll ,这意味着你将获得Sizzle给出的专有行为而不是有效的DOM行为。


如果Sizzle实际上是querySelectorAll的兼容性补丁会很好,但事实并非如此,所以你必须处理由此产生的不一致性。


编辑:

似乎有一个优化,如果针对多个元素调用filter() ,则使用Sizzle ,但如果只使用一个元素,则使用is()

这很重要,因为is()将在拥有它的浏览器中使用matchesSelector ,而matchesSelector将给出与querySelectorAll相同的评估。 该评估与Sizzle不同。

('[checked]')检查是否存在checked属性。 当选中/取消选中复选框时,浏览器似乎添加/删除此属性。