为什么* 表现得像:使用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
属性。 当选中/取消选中复选框时,浏览器似乎添加/删除此属性。