抱歉这样一个基本问题。任何人都可以确切地解释这个函数如何作为.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 :(得分: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并保留所有元素并相应地返回这些元素。