JQuery原型对象(续)
Test_Html
(4).each(callback,args)
迭代JQuery对象上的元素并调用callback参数,如果某次迭代中callback返回false,停止迭代.args为callback的参数,args必须为数组.在callback中this引用的当前迭代的元素.
Test_HTML
<
body
>
<
div
id
=
"div1"
>
div1
</
div
><
div
id
=
"div2"
>
div2
</
div
>
<
span
id
=
"span1"
>
span1
</
span
><
span
id
=
"span2"
>
span2
</
span
><
span
id
=
"span3"
>
span3
</
span
>
</
body
>
Test_Script
$(function(){
var $div = $('div' );
var args = [":参数" ]
$div.each( function(){
alert( this.id + arguments[0]);
return false ;
},args); //只弹出一次 div1:参 数
});
.each(callback, args)调用了JQuery的静态函数JQuery.each(obj, callback, args)
JQuery.each(obj, callback, args)的源码也比较简单,见注释
// args is for internal usage only
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
//如果有参数
if ( args ) {
//如果是类数组
//则用使用obj[下标]的方式访问迭代的元素
if ( isArray ) {
for ( ; i < length; i++ ) {
//绑定回调函数的执行作用域,即回调函数使用this时,this指向当前迭代的元素,回调函数的参数为传入的args
value = callback.apply( obj[ i ], args );
//如果返回false,退出迭代
if ( value === false ) {
break;
}
}
//如果不是是类数组
//则用for-in迭代
} else {
for ( i in obj ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
//和上个分支的处理一样这
//只是没有传入args
//大量的重复代码是为了更少的逻辑判断,匹配最长用的方式,使处理更快
} else {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
}
}
//返回要迭代的obj,通常是jquery对象
return obj;
},
(5) .map(callback)
迭代JQuery对象中的元素,每次迭代执行callback方法,返回callback返回值数组组成的新的JQuery对象.
Test_Html
<
body
>
<
div
id
=
"div1"
>
div1
</
div
><
div
id
=
"div2"
>
div2
</
div
>
<
span
id
=
"span1"
>
span1
</
span
><
span
id
=
"span2"
>
span2
</
span
><
span
id
=
"span3"
>
span3
</
span
>
</
body
>
Test_Script
var $div = $('div' );
$div.map( function (){
return this .parentNode;
}).each( function (){
alert( this .tagName); //弹出两次 BODY
});
map源码:
map: function( callback ) {
return this .pushStack( jQuery.map( this, function ( elem, i ) {
return callback.call( elem, i, elem );
}));
},
.map(callback)调用$.map()根据其返回的元素数组返回一个新的JQuery对象.
$.map(elements, callback, arg)源码
map: function( elems, callback, arg ) {
var value,
i = 0,
length = elems.length,
isArray = isArraylike( elems ),
//存放结果的数组
ret = [];
// Go through the array, translating each of the items to their new values
if ( isArray ) {
for ( ; i < length; i++ ) {
//嗲用callback绑定执行作用域为当前迭代元素
value = callback( elems[ i ], i, arg );
if ( value != null ) {
//将返回值推入数组末尾
ret.push( value );
}
}
// Go through every key on the object,
} else {
for ( i in elems ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
}
// Flatten any nested arrays
return concat.apply( [], ret );
},