继从上一个问题 https://stackoverflow.com/questions/8673201/why-does-checked-not-match-a-single-checked-input-box.
假设我在加载 jQuery 1.5.2 的页面上有两个复选框
<input id="test1" type="checkbox"/>
<input id="test2" type="checkbox"/>
然后让我们单击它们以分别给出checked
财产。
现在让我们抓取所有复选框并过滤掉未选中的复选框
var numOfCheckedBoxes = $("input:checkbox").filter("*[checked]").size();
现在根据问题的答案上一个问题 https://stackoverflow.com/questions/8673201/why-does-checked-not-match-a-single-checked-input-box,我期望numOfCheckedBoxes
等于0
但它等于2
。我现在应该使用$("input:checkbox:checked")
or $("input:checkbox").filter(":checked")
.
这与我这样做不同
var numOfCheckedBoxes = $("#test1").filter("*[checked]").size();
其中设置numOfCheckedBoxes
等于0
.
这是 jsFiddle 的第一个有问题的场景 http://jsfiddle.net/2QZvU/9/。
这是 jsFiddle 的有问题的第二种情况 http://jsfiddle.net/2QZvU/13/.
因为在现代浏览器中,DOM 选择将通过querySelectorAll
.
这意味着在进行 DOM 选择时,*[checked]
实际上会寻找该特定属性。
当你这样做时':checked'
在 DOM 选择中,您使用的是Sizzle
扩展名是无效的CSS,所以querySelectorAll
没有被使用,因此Sizzle
使用时,它会查看属性和属性。
所以这里的区别在于.filter()
不/不能使用querySelectorAll
,这意味着您将获得由下式给出的专有行为Sizzle
而不是有效的 DOM 行为。
如果Sizzle
实际上是一个兼容性补丁querySelectorAll
,但事实并非如此,因此您必须处理由此产生的不一致。
EDIT:
似乎有一个优化,如果filter()
针对多个元素进行调用,Sizzle
被使用,但如果只有一个元素,那么is()
用来。
这很重要,因为is()
将使用matchesSelector
在有它的浏览器中,并且matchesSelector
将给予相同的评价querySelectorAll
。该评价不同于Sizzle
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)