jquery 裏的each使用方法

jQuery 中的each函數 很方便,$.each ()函數封裝了十分強大的遍歷功能,它可以遍歷一維數組、多維數組、DOM , JSON 等等,在javaScript 開發過程中使用$each可以大大的減輕我們的工作量,這裏貼一個簡單的模仿each的函數,只能處理數組類型的對象

1 function each(arr,fn) {
2 for ( var i = 0, l = arr.length; i < l; fn.call(arr[i], i++));
3 }
4 var a=[ 'first' , 'second' , 'third' ];
5 each(a, function (i){alert(a[i])});

我們看下jQuery1.2.6中的each實現

01 function (object, callback, args) {
02 //該方法有三個參數:進行操作的對象obj,進行操作的函數fn,函數的參數args
03 var name, i = 0,length = object.length;
04 if (args) {
05 if (length == undefined) {
06 for (name in object) {
07 if (callback.apply(object[name], args) === false ) {
08 break ;
09 }
10 }
11 } else {
12 for (; i < length;) {
13 if (callback.apply(object[i++], args) === false ) {
14 break ;
15 }
16 }
17 }
18 } else {
19 if (length == undefined) {
20 for (name in object) {
21 if (callback.call(object[name], name, object[name]) === false ) {
22 break ;
23 }
24 }
25 } else {
26 for ( var value = object[0]; i < length && callback.call(value, i, value) !== false ; value = object[++i]) {}
27 /*object[0]取得jQuery對象中的第一個DOM元素,通過for循環,
28 得到遍歷整個jQuery對象中對應的每個DOM元素,通過 callback.call( value,i,value);
29 將callback的this對象指向value對象,並且傳遞兩個參數,i表示索引值,value表示DOM元素;
30 其中callback是類似於 function(index, elem) { ... } 的方法。
31 所以就得到 $("...").each(function(index, elem){ ... });
32 */
33 }
34 }
35 return object;
36 }

如果我們想中途continue 或者break循環怎麼辦

在jQuery的each()中

return true等於continue ;

return false等於break;

jquery中有兩個each函數一個是jQuery.each()一個是jQuery.fn.each()

jQuery對象提供的each方法則是對jQuery內部的子元素進行逐個調用。

1 jQuery.prototype.each= function ( fn, args ) {
2 return jQuery.each( this , fn, args );
3

}




each()函數是基本上所有的框架都提供了的一個工具類函數,通過它,你可以遍歷對象、數組的屬性值並進行處理。jQuery和jQuery對象都實 現了該方法,對於jQuery對象,只是把each方法簡單的進行了委託:把jQuery對象作爲第一個參數傳遞給jQuery的each方法.換句話 說:jQuery提供的each方法是對參數一提供的對象的中所有的子元素逐一進行方法調用。而jQuery對象提供的each方法則是對jQuery內 部的子元素進行逐個調用。

這個JQUERY裏的核心代碼

jQuery.prototype.each=function( fn, args ) {
return jQuery.each( this, fn, args );
}

   讓我們看一下jQuery提供的each方法的具體實現,
jQuery.each(obj,fn,arg) 
該方法有三個參數:進行操作的對象obj,進行操作的函數fn,函數的參數args。
讓我們根據ojb對象進行討論:

    1.obj對象是數組
each方法會對數組中子元素的逐個進行fn函數調用,直至調用某個子元素返回的結果爲false爲止,也就是說,我們可以在提供的fn函數進行處理,使 之滿足一定條件後就退出each方法調用。當each方法提供了arg參數時,fn函數調用傳入的參數爲arg,否則爲:子元素索引,子元素本身
2.obj 對象不是數組
該方法同1的最大區別是:fn方法會被逐次不考慮返回值的進行進行。換句話說,obj對象的所有屬性都會被fn方法進行調用,即使fn函數返回false。調用傳入的參數同1類似。
jQuery.each=function( obj, fn, args ) {
if ( args ) {
if ( obj.length == undefined ){
for ( var i in obj )
fn.apply( obj, args );
}else{
for ( var i = 0, ol = obj.length; i < ol; i++ ) {
if ( fn.apply( obj, args ) === false )
break;

              }

           }
} else {
if ( obj.length == undefined ) {
for ( var i in obj )
fn.call( obj, i, obj );
}else{
for ( var i = 0, ol = obj.length, val = obj[0]; i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}

           }
}
return obj;

需要特別注意的是each方法中fn的具體調用方法並不是採用簡單的fn(i,val)或fn(args),而是採用了 fn.call(val,i,val)或fn.apply(obj.args)的形式,這意味着,在你自己的fn的實現中,可以直接採用this指針引用 數組或是對象的子元素。這種方式是絕大多數jQuery所採用的一種實現方式。

 還是通過實例來說明吧

 先看代碼:

$("#submit").click(function(){
try{
$('#leftTbl tr').each(function(i){
var emailInput = $("#email_"+(1+i));
if(!re.test(emailInput.val())){
alert("請正確填寫email");
emailInput.focus();
throw emailInput;
}else{
email = emailInput.val();
}
});
}catch(e){
return false;
}
$("#pageform").submit();
});

通過throw 然後catch實現,也可以做了計數器到最後判斷他的值!

上面的代碼似乎和標題沒什麼關係,那麼在each裏如何實現break與continue 其實看下面還是有關係的…

$('input').each(function(){
if($(this).val() == ''){
// do something
if(1==1)return false; // 使用return false 來實現跳出循環。
else return true; // 使用return true 來實現進入下一個循環。
}
});

jquery裏面應該是迭代每一個元素後查看返回的值,判斷是否繼續迭代下一個元素
原創文章,轉載請註明:同路吧 www.tlbar.com.cn

   var arr = [ "one", "two", "three", "four"];     
$.each(arr, function(){     
alert(this);     
});     
//上面這個each輸出的結果分別爲:one,two,three,four    

var arr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]]     

$.each(arr1, function(i, item){     
alert(item[0]);     
});     
//其實arr1爲一個二維數組,item相當於取每一個一維數組,   
//item[0]相對於取每一個一維數組裏的第一個值   
//所以上面這個each輸出分別爲:1   4   7     


var obj = { one:1, two:2, three:3, four:4};     

$.each(obj, function(key, val) {     
alert(obj[key]);           
});   
//這個each就有更厲害了,能循環每一個屬性     
//輸出結果爲:1   2  3  4    
發佈了47 篇原創文章 · 獲贊 8 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章