jquery中find和filter有什么区别?

时间:2013-09-23 11:48:23

标签: jquery

以下代码中哪种方法最好:

$('#navs li').find('.activenav').removeClass('activenav');
$('#navs li').filter('.activenav').removeClass('activenav');

或者我可以像这样使用

$('#navs li').find('.activenav').filter('.activenav').removeClass('activenav');

or 

$('#navs li').filter('.activenav').find('.activenav').removeClass('activenav');

如果我这样做会怎么样?


更新

我可以绑定到find和filter,因为我的代码有时需要查找并且有时需要进行过滤

5 个答案:

答案 0 :(得分:6)

find方法会在 下搜索当前匹配元素的匹配元素

filter方法在当前匹配元素集中搜索匹配元素

考虑这个HTML:

<div class="foo">
  <a class="foo">Bar</a>
</div>

这个jQuery:

$('div').filter('.foo').hide(); // hides the div with the class "foo"

$('div').find('.foo').hide(); // hides the child anchor with the class "foo"

请注意,两者都会导致隐藏元素,但它们会针对不同的元素。

答案 1 :(得分:1)

<强> filter() – search through all the elements.

将匹配元素集合减少到与选择器匹配的元素或传递函数的测试

find() – search through all the child elements only.

获取当前匹配元素集中每个元素的后代,由选择器过滤。

答案 2 :(得分:0)

前两行不等同。

.find查找当前jQuery对象的后代,因此第一行查找具有该类的li的所有子项。

.filter创建一个新的jQuery对象,该对象仅包含与选择器匹配的原始对象的那些元素,因此第二行查找实际拥有该类的所有li

鉴于此,第一个替代方案实际上是无操作(.filter不会从集合中删除任何项目)但第二个是不正确的,因为它将首先找到任何li该类,然后仅对那些拥有该类的li元素的进行操作。

答案 3 :(得分:0)

filter()搜索jQuery数组并查找您选择的选择器,find()使用您选择的选择器搜索所有子项

<强>更新

是的,您可以同时使用find()和filter(),例如$('.myClass').find('.myChildClass').filter('.myFilterClass');

答案 4 :(得分:0)

来自元素集合的

filter 过滤器结果,而find 从元素中找到结果(使用元素作为父元素进行搜索)。

关于SO代码的一个例子:

$("div").filter("#notify-container");
//Gives us a result, as we have a collection of `div` elements and **filter** the already made collection to only include `div`'s with the ID `notification-container`

$("div").find("#notify-container")
//Gives us no results as it tries to find `#notify-container` elements **inside** the `div` elements.