理解.filter()的函数参数

时间:2014-01-07 16:18:07

标签: jquery html

抱歉这样一个基本问题。任何人都可以确切地解释这个函数如何作为.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)相同 - 我不明白这一点。

此功能返回某些内容吗?有人可以解释这是如何工作的及其局限性?感谢。

3 个答案:

答案 0 :(得分:4)

将帮助您理解filter()函数的回调函数的相关句子from the documentation是:

  

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

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

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


让我们以此代码为例:

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

您可以从选择器中看到元素实际上并不存在 - 但您仍然会看到console.log,因为空的jQuery对象不会评估为“false”。

答案 1 :(得分:2)

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

$(this).eq(2);

这将返回一个jQuery对象。它是否包含任何东西是一个不同的故事,但jQuery对象(甚至是空对象)是“真实的”。所以这将使你回归每一个元素。

答案 2 :(得分:2)

基本上.filter()使用参数作为函数将迭代当前正在选择的所有元素,并且该函数内部的返回将决定是保留该特定元素还是跳过它。在您的情况下,....eq(2)将始终返回一些对象,因此在这种情况下,它会将其视为true并保留所有元素并相应地返回这些元素。