Jquery源码分析---jQuery类数组的分析
2010-09-14 13:36:40 来源:WEB开发网4.2.3 元素的过滤
我们可以把其它的元素增加到类数组中来,那么有的时候也得到把类数组中的不适合的元素剔出类数组。Jquery对象提供了filter,not来过滤那样不用的元素。
// 筛选出与指定表达式匹配的元素集合。可以通过函数来筛选当前jQuery对象的
// 元素,还有通过用逗号分隔多个表达式来筛选
filter : function(selector) {// grep,multiFilter的综合
return this.pushStack(jQuery.isFunction(selector)
&& jQuery.grep(this, function(elem, i) {
return selector.call(elem, i);
}) || jQuery.multiFilter(selector, this));
},
filter其实是grep,multiFilter的综合,如果参数是函数的话,就采用jQuery.grep来完成,否则采用jQuery.multiFilter来进行selector方式的过过滤。可以看出参数也只能是Fn,String这两种类型。
jQuery.grep提供了以自定义的函数回调的形式来过集合的不需要的元素,最后形成需要的数组,和map函数有点类似。
// 过滤elems中满足callback处理的所有元素,inv是否相反
grep : function(elems, callback, inv) {
var ret = [];
for (var i = 0, length = elems.length;i < length; i++)
if (!inv != !callback(elems[i], i))
ret.push(elems[i]);
return ret;
},
代码中!inv != !callback(elems[i], i)这一句比较难理解。它的意义是如果显示指定inv==true。那么callback就得返回false才是符合条件。这里采用三个!就是为了处理这种默认的情况。!inv在undefined,””,false,null,0的时候都会为真,而!callback的返回值如果也是这五种之一的情况也会为真。而它们之间有一个!=,说明不能同时为真为假时才执行ret.push(elems[i]);
更多精彩
赞助商链接