1,获取元素集合(选择器)
2,操作元素集合
而第二步操作元素集合的主要方法就是jquery.each。查看源码,我们发现jquery.each及this.each分别调用了27次和31次。可见它是多么的重要。
这篇将分析下jquery.each及this.each方法。看看他们如何与jquery.extend一起扩展jquery库。最后我会给zchain.js加上each方法。
部分源码如下
复制代码 代码如下:
jquery.fn = jquery.prototype = {
...
// execute a callback for every element in the matched set.
// (you can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
return jquery.each( this, callback, args );
},
...
}
jquery.extend({
...
// args is for internal usage only
each: function( object, callback, args ) {
var name, i = 0,
length = object.length,
isobj = length === undefined || jquery.isfunction( object );
if ( args ) {
if ( isobj ) {
for ( name in object ) {
if ( callback.apply( object[ name ], args ) === false ) {
break;
}
}
} else {
for ( ; i if ( callback.apply( object[ i++ ], args ) === false ) {
break;
}
}
}
// a special, fast, case for the most common use of each
} else {
if ( isobj ) {
for ( name in object ) {
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
break;
}
}
} else {
for ( ; i if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}
}
}
}
return object;
},
...
});
以上可看出,
1,jquery().each是直接挂在jquery.prototype(jquery.fn)上的,因此每个jquery对象都包含each方法。
2,jquery.each是通过jquery.extend({})方式扩展的。前面已经说过,通过这种方式扩展的方法将挂在function jquery上,即为jquery类的静态方法。
3,jquery().each方法中只有一句:return jquery.each( this, callback, args )。即jquery对象的each方法实现上其实就是调用jquery静态的jquery.each。因此jquery.each才是关键所在。
下面详细分析jquery.each,它有三个参数object, callback, args。
1,object可以为数组(array),对象(object),甚至是函数类型(functoin);
2,callback是回调函数,类型为function;
3,args为jquery库自身使用,使用者不会用到该参数,这里暂不讨论该参数情况。
函数中第一句定义必要的变量
复制代码 代码如下:
var name, i = 0,
length = object.length,
isobj = length === undefined || jquery.isfunction( object );
length=object.length很好理解,有三种情况length不为undefined
1, object为数组类型(array)时,数组具有length属性;
2, object为函数类型(functoin)时,length为该函数定义的参数个数,如果该函数没有定义参数,length为0;
3, 具有length属性的object伪数组(如:arguments,htmlcollection,nodelist等)。
变量isobj用来判断是否是对象类型,有两种情况为true:
1,变量length等于undefined,即所传object没有length属性。
2,参数object为函数类型
这里强调下object为jquery对象。即当在$(xx).each时发生,这时会将this传到$.each中。如:return jquery.each( this, callback, args )。这里第一个参数this即为jquery对象,每个jquery对象是具有length属性的。
each中有以下两个分支
1,如果isobj为true,则用for in语句去遍历该对象,如果把每个迭代的对象看出键值对形式的话。callback中的this是值object[name],callback第一个参数是键name,第二个参数是值object[name]。
2,如果isobj为false,则用for循环去遍历数组(类数组)。callback中的this是数组中单独元素的值value,callback第一参数是数组的索引i,第二参数是数组单独元素值value。
callback调用后返回值如果是false则停止迭代,跳出循环。这里用严格===来判断是否与false相等。顺便提一下,函数如果没有显示的return,默认返回undefined。
总结下:
1,$(xx).each的each是jquery对象的方法,它调用静态的jquery.each。它只用来迭代jquery对象,jquery对象可以看成一个伪数组(具有length属性,用索引方式存取)。
2,$.each的each是function jquery的静态方法(即jquery.each),可以迭代对象,数组,伪数组,函数。
zchain-04.rar