删除选择器不工作

时间:2013-04-23 01:55:14

标签: jquery

为什么: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

2 个答案:

答案 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匹配所有元素。

相关问题