为什么:odd
选择器在将其传递到remove(selector)
函数时不起作用?根据{{3}},它应该过滤已选择的一组项目,在这种情况下是li
。
<ul id='list1'>
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
<ul id='list2'>
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
$(document).ready(function() {
$('#list1').children(':odd').remove(); // works as expected
$('#list2').children().remove(':odd'); // does not work
});
结果
-One
-Three
-One
-Two
-Three
-Four
答案 0 :(得分:6)
这实际上是一个错误:http://bugs.jquery.com/ticket/13721
并于17天前在jQuery 2.0修复。
问题在于它正在检查每个元素是否与选择器匹配:
for element in matched_elements:
if element matches the selector:
remove element
:odd
仅适用于一组匹配元素的上下文,因此这些元素中没有一个是奇数。同样,如果您将其更改为:even
,则会删除所有这些内容。
答案 1 :(得分:2)
传递给remove
的选择器曾经在运行中匹配,也就是说,针对选择器测试每个元素并在匹配时删除它,一次一个元素。 (source code)
此行为在jQuery 2.0中已更改,现在在执行删除之前应用选择器过滤器。参见:
#13721: remove(“:nth-child(1)”) works differently than filter(“:nth-child(1)”).remove()
(编辑:对结果行为说明的修正,@ Flatder是正确的)。在这种情况下,没有匹配,因为每个元素都是单独针对选择器进行检查的。
因此,:odd
selector将永远不会匹配,因为所有元素都将被视为jQuery对象的索引0
(这是:odd
/ :even
检查时)选择器。这解释了为什么:odd
永远不匹配,:even
匹配所有元素。