5

为什么:odd当我将它传递给remove(selector)函数时选择器不起作用?根据文档,它应该过滤已经选择的一组项目,在这种情况下是li's.

<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
4

2 回答 2

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,所有这些都将被删除。

于 2013-04-23T02:04:40.573 回答
2

传递给的选择器remove用于动态匹配,即针对选择器测试每个元素并在匹配时将其删除,一次一个元素。(源代码

这种行为在jQuery 2.0中有所改变,现在在删除之前应用选择器过滤器。看:

#13721: remove(“:nth-child(1)”) 与 filter(“:nth-child(1)”).remove() 的工作方式不同


编辑:对结果行为解释的更正,@Blender 是正确的)。在这种情况下,没有匹配项,因为每个元素都被单独检查过选择器。

因此,:odd选择器永远不会匹配,因为在针对选择器进行测试时,所有元素都将被视为 jQuery 对象的索引0(这是:odd/:even检查的内容)。这解释了为什么:odd从不匹配并且:even会匹配所有元素。

于 2013-04-23T02:05:10.260 回答