首页 > 代码库 > 当filter使用函数而非选择器来过滤元素时的一个有趣的地方
当filter使用函数而非选择器来过滤元素时的一个有趣的地方
JQuery官方API关于filter方法的介绍有这么一个实例:
<div id="first"></div> <div id="second"></div> <div id="third"></div> <div id="fourth"></div> <div id="fifth"></div> <div id="sixth"></div> <script> $( "div" ) .css( "background", "#b4b0da" ) .filter(function( index ) { return index === 1 || $( this ).attr( "id" ) === "fourth"; }) .css( "border", "3px double red" ); </script>
也就是说除了常规的使用.filter(selector)的方式来过滤内容外,我们还可以使用
.filter(function(index) {
....//判断语句,返回Boolean值
})
的方式来实现所需功能。需要了解的是这里的function(index) { }函数是一个起遍历作用的匿名函数,它会对使用.filter的JQ对象进行遍历。对于被遍历的每个元素,如果该函数返回 true,则元素会被包含在已筛选集合中;否则,会排除这个元素。
于是上方的API代码表示的是对div集合进行遍历,返回其中索引为1或者id="fourth"的div集合,然后再通过.css()进行进一步处理。
这里需要了解的是$(this)表示的是当前被遍历的元素。为了加深了解,我们看下一个例子:
<!DOCTYPE html> <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> </head> <body> <ul> <li><strong>list</strong> item 1 - one strong tag</li> <li><strong>list</strong> item <strong>2</strong> - two <span>strong tags</span></li> <li>list item 3</li> <li>list item 4</li> <li>list item 5</li> <li>list item 6</li> </ul> <script> $(‘li‘).filter(function(index) { console.log($(this).text()); return $(‘strong‘,this).length == 1; }).css(‘background-color‘, ‘red‘); </script> </body> </html>
执行结果是这样的:
这段代码里有三个地方可以唠嗑下。
⑴ 首先是$(this),我们上边已经提过了,它指向当前正被遍历的元素。所以log出来是每一个元素的文本内容。
⑵ 接着是 $(‘strong‘,this) 的写法。我们常规使用JQ选择器的写法一般是$(selector)的形式,但我们这边还多了个第二个参数this,它是一个上下文参数,一般是一个DOM元素集合的JQ对象(其实跟selector一样,不用纠结),可以限制selector的搜索范围,我们可以看这个例子:
<script>$(function (){ $("li","div").css(‘background-color‘, ‘red‘); }) </script> <ul> <li><strong>list</strong> item 1 - one strong tag</li> <li><strong>list</strong> item <strong>2</strong> - two <span>strong tags</span></li> <li>list item 3</li> <div><li>list item 4</li></div> <li>list item 5</li> <li>list item 6</li> </ul>
这样只有div里面的li的背景颜色才会变成红色,也就是说li的搜索范围被限制在div的范围里了。
⑶ 第三个比较有趣的是$(‘strong‘,this)里的this,它跟$(this)是完全不同的对象,说它有趣是因为它不表示document不表示window,而表示当前已经被遍历过的元素的集合。若你在函数function(index) { }内加上这一句:
console.log(this===$(this).get(index));
会发现这样有趣的结果:
这是因为当遍历的索引为0的时候,this指向第一个被遍历到的li元素,而$(this)也是指向第一个被遍历到的li元素,故两者全等;
但当索引为1的时候,this指向被遍历到的第一个和第二个li元素的集合,而$(this)是指向第二个被遍历到的li元素,故两者不等,后面的索引亦然。
这些知识点了解了,我们自然很容易知道这句代码的意思:
return $(‘strong‘,this).length == 1;
它表示在所有当前时刻被遍历过的li集合上查找含strong标签的li集合,并判断这个集合的长度是否等于1,如果是才返回true(返回true的话filter会获取这个集合)。
那么什么时候这个集合的长度才等于1呢?当然是第一次遍历(索引为0)的时候,此时的this指向包含第一个被遍历到的li元素的集合,集合长度为1。
唠嗑完了,明早还要上班,睡觉去~