2014-01-07 30 views
2

对不起,这样一个基本的问题。任何人都可以解释这个函数如何作为.filter()里面的参数吗?了解.filter()的函数参数

我试过使用了几次,但它并不总是返回我所期望的。例如:

<ul> 
    <li><a href="#" class="">This is a link</a></li> 
    <li><a href="#" class="">This is a link</a></li> 
    <li><a href="#" class="">This is a link</a></li> 
    <li><a href="#" class="">This is a link</a></li> 
    <li><a href="#" class="" rel="bs">This is a link</a></li> 
</ul> 

-

$(document).click(function(){ 
    $("ul li a").filter(function(){ 
     return $(this).eq(2); // selects every a 
    }).before("String");  
}); 

还是选择每a - 同样与return $("ul li a").eq(2) - 我不明白这一点。

请问这个功能要返回什么吗?有人可以解释这是如何工作和它的限制?谢谢。

+0

'$(this).eq(2)'应该做什么?你的标准是什么?你想过滤哪些元素? –

回答

4

有关刑罚from the documentation,这将有助于你了解filter()功能的回调函数是这样的:

这种方法的第二种形式允许我们对筛选的功能,而不是一个选择的元素。对于每个元素,如果函数返回true(或“真值”),则该元素将包含在过滤后的集合中;否则,它将被排除。

基本上,当您提供的回调函数返回一个非“falsy”值时,该值将添加到生成的jQuery对象中。

您正在使用的测试是$(this).eq(2) - 如果该命令的结果未计算为false,则会将其添加到生成的jQuery对象中。


让我们这个代码为例:

if ($("#non_existant_element")){ 
    console.log("truthy value!"); 
} 

你可以选择看到该元素根本不存在 - 但你仍然会看到console.log,因为一个空的jQuery对象不评估为“假”。

+0

完美,谢谢。 – user2129623

+0

@ user2129623 - 非常欢迎您:)快乐编码! – Lix

2

.filter()为每个元素调用传递函数。如果函数返回一个“真值”值,那么它将保存在集合中。如果它返回“falsy”值,则将其删除。

$(this).eq(2); 

这将返回一个jQuery对象。它是否包含任何内容是一个不同的故事,但一个jQuery对象(甚至是空的)是“真理”。所以这会让你回想起每一个元素。

2

基本上.filter()带有一个参数作为函数将遍历当前选中的所有元素,并且该函数内的返回将决定是否保留该特定元素或跳过它。在你的情况下,....eq(2)将总是返回一些对象,所以在这种情况下,它会认为它为true,并保留所有元素并相应地返回这些元素。