Jquery源码分析---jQuery类数组的分析
2010-09-14 13:36:40 来源:WEB开发网分析not函数,我们首先从参数分析开始,它支持string的CSS selector表达式,还支持(类)数组这样的集合及dom元素。如果selector表达式是class单表达式筛选的话,那就调用jQuery.multiFilter过滤之后直接返回。这个本来是不需要做判断单独处理。但是这样会提高效率,很多时间都是采用单表达的class的形式来进行筛选。
它为什么可以独立返回,而可以不用和this中的元素进行比较?因为.class不会改变this的集合的元素,只是剔除一些元素。而对于像#、:的有些操作是会完成变更返回的集合。这个集合是在this的集合的基础之上新构建的集合,会增加一些元素。有那么就得比较。
多表达式返回的是数组,如果传入的参数是元素或(类)数组,它们会统一起来,然后调用filter(function)的来实现比较。对于数组,就是取this的集合与selector的集合的交集。这样就保证了采用CSS筛选或传入的数组筛选之后的元素一定是this的集合的元素。对于传入的参数是单个的元素,那就直接比较,如果this中有这个元素,就返回这个元素。
可以看出not比filter的适用范围更广,而且使用filiter可能还会有潜在的错误,因为它的CSS selector的返回的元素集合很有可能有的元素不包含在当前的this的集合之中。这在某一些场合是很有用的。但是一般不明白原理的用户会感觉到莫名其妙的错误。在使用中最好还是采用not,而不是filter。
在上一节的add的函数中,我们看到jQuery.unique(),看名字就知道它是对集合的元素进行唯一性处理,也就是集合的元素没有重复的。这个unique只是针对于Dom元素。如Ext.DomQuery中的nodup一样处理。
// 判断数组中的元素是否有重复的元素,返回不重复的所有元素。
unique : function(array) {
var ret = [], done = {};
try {
for (var i = 0, length = array.length;i < length; i++) {
var id = jQuery.data(array[i]);
if (!done[id]) { done[id] = true; ret.push(array[i]);}
}
} catch (e) { ret = array;}
return ret;
}
更多精彩
赞助商链接