41-解决方案
2.10.2 解决方案
如果搜索的元素具有非常特殊的性质,选择器表达式可能不是最好的工具。使用jQuery的DOM过滤方法( filter() ),可以根据函数中表达的任何条件选择元素。
jQuery中的过滤器方法允许传递一个字符串(也就是,选择器表达式)或者一个函数作为参数。如果传递的是一个函数,它的返回值将定义某个元素是否被选择。传递的函数将对当前选择集中的每个元素运行;每当函数返回假值时,对应的元素就从选择集中删除,每当返回真值时,对应的元素不受影响(即留在集合中)。
jQuery('*').filter(function(){
return !!jQuery(this).css('backgroundImage');
});
上述代码选择所有具有背景图片的元素。
初始集合是所有元素(*);然后以一个函数为参数调用 filter() 方法。这个函数在讨论的元素指定了 backgroundImage 时返回真值。你看到的 !! 是JavaScript中将任何类型值转换为布尔表达方式的快速方法。被当作假值的包括空字符串、数值0、数值 undefined 、空类型,当然还有布尔值false。如果查询 backgroundImage 返回的是上述值,该函数将返回 false ,从而删除集合中所有没有背景图片的元素。刚刚讲解的大部分内容并不是jQuery特有的,只是JavaScript的基础知识。
实际上, !! 没有必要,因为jQuery将把返回值转换为布尔值,但是保留它仍是一个好主意;任何查看你的代码的人都能绝对肯定你的意图(有助于可读性)。
在传递给 filter() 的函数中,可以通过 this 关键字引用当前元素。将它包装在jQuery函数中就可以变成一个jQuery对象(这样就可以访问和执行jQuery方法):
this; // 常规的元素对象
jQuery(this); // jQuery对象
下面是其他一些激发你的想象力的过滤示例:
//选择所有宽度在100-200像素之间的DIV元素:
jQuery('div').filter(function(){
var width = jQuery(this).width();
return width > 100 && width < 200;
});
//选择所有带有常用图像文件扩展名的图像:
jQuery('img').filter(function(){
return /\.(jpe?g|png|bmp|gif)(\?.+)?$/.test(this.src);
});
//选择所有具备10个或者20个子元素的元素:
jQuery('*').filter(function(){
var children = jQuery(this).children().length;
return children === 10 || children === 20;
});