jquery1.0源码解读
$().each(function(){})的流程是怎样的
顾名思义,each就是对集合中的每个元素调用传入的function函数.
jQuery.fn.each
1 | //each实例方法 |
jQuery.each
那就找到jQuery静态方法each:1
2
3
4
5
6
7
8
9
10
11each: function( obj, fn, args ) {
if ( obj.length == undefined )//如果不是数组
for ( var i in obj )
fn.apply( obj[i], args || [i, obj[i]] );
else
for ( var i = 0; i < obj.length; i++ )
//如果存在参数args那么就传索引和当前jquery元素给参数fn函数
//fn内部引用的就是当前obj[i]元素
fn.apply( obj[i], args || [i, obj[i]] );
return obj;
}
因为$(“.li”)返回的都是类数组对象,索引obj.length 就是当前数组元素的个数
$(“.li”)首先调用jQuery.find( a, c )静态函数,c为空
jQuery.find
1 | find: function( t, context ) { |
jQuery.token数组
一共8个,最后一个为function1
2
3
4
5
6
7
8
9
10
11
12
13 token: [
"\\.\\.|/\\.\\.", "a.parentNode",
">|/", "jQuery.sibling(a.firstChild)",
"\\+", "jQuery.sibling(a).next",
"~", function(a){
var r = [];
var s = jQuery.sibling(a);
if ( s.n > 0 )
for ( var i = s.n; i < s.length; i++ )
r.push( s[i] );
return r;
}
]
".li"
一个都不匹配,进入(!findToken)
匹配/^([#.]?)([a-z0-9\\*_-]*)/i;
,且顺序如下:
0: “.example”
1: “.”
2: “example”
jQuery.merge
进入jQuery.merge函数,此时m[2]为”*”,r为[]数组:1
2
3
4
5jQuery.merge( r,
m[2] == "*" ?
jQuery.getAll(ret[i]) :
ret[i].getElementsByTagName(m[2])
);
jQuery.getAll静态函数:
1 | getAll: function(o,r) { |
getAll递归返回所有o的子节点
0: html
1: head
2: script
3: script
4: body
5: div.example
6: div.example
7: script
jQuery.filter 函数过滤:
1 | jQuery.filter(t,r); |
jQuery.merge再合并:
1 | if ( ret && ret[0] == context ) ret.shift();//弹出context返回数组原来的第一个元素的值 //该方法会改变数组的长度 |
返回的done就包含合并后的所有元素数组