JQuery日記 2014-04.29

JQuery原型對象(續)

(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 );
       },


     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章