给出以下标记
<ul class="list">
<li>first item</li>
<li class="item">second item</li>
<li>third item</li>
</ul>
哪两个这两个表达式最好选择第二个li?
$("ul li.item")
或
$("ul li").filter(".item")
这不是一个很好的例子,因为它太简单了(我知道我可以做$(".item")
,但总的来说,我应该使用复杂的选择器还是过滤器功能?
编辑:如果第一个更有效,何时使用过滤功能是合适/最佳?
答案 0 :(得分:18)
第一个更快:
$("ul li.item")
这是真的,因为它是等价的,但没有运行选择器引擎(Sizzle)两次到达那里。
对于您的修改:您使用.filter()
...当您需要过滤当前集时,或需要复杂过滤器时。例如,如果您想链接但不再选择该组:
$("ul li").addClass('everyItem').filter('.item').fadeOut();
或复杂的过滤器:
$("ul li").filter(function() {
return $.data(this, 'hasSomething');
}).fadeOut();
过滤器有许多用途,它实际上取决于最适合的情况。与你的问题有关,$(selector).filter(selector)
...我想不出一个案例,如果它完全可能,你会想要这个。我无法做到这一点的唯一理由就是复杂:has()
和:not()
包裹。