@OverWrite BlogJava

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 29 評論 :: 0 Trackbacks
          在jQuery.js的構(gòu)造函數(shù)中,充分利用了JavsScript語言的動(dòng)態(tài)性——對行參的類型和個(gè)數(shù)沒有的嚴(yán)格要求,以至于一個(gè)函數(shù)可以實(shí)現(xiàn)多種功能需求,也為JavaScript語言的多態(tài)性提供了基礎(chǔ),在這個(gè)構(gòu)造函數(shù)中,提供了六種不同的調(diào)用格式(根據(jù)官方API文檔),具體如下($ = jQuery):

            1、$(String expr):根據(jù)給定的CSS選擇符查找匹配的元素,如$("div>p");
            2、$(Element elem):將給定的DOM元素對象轉(zhuǎn)換為jQuery對象,如$(document).find("div>p");
            3、$(Array<Element> elems):如$(myForm.elements).hide();
            4、$(Function fn):是$(document).ready()的簡寫模式,如:$( function fn(){ ... } );
            5、$(jQuery obj):如:var div = $("div");   $(div).find("p");
            6、$(String expr, Element context):在context中查找expr,如:$("div", xml.responseXML);

            另外,jQuery中提到了Chainable Methods的思想,也就是調(diào)用jQuery中的方法會(huì)返回一個(gè)jQuery對象,仍然可以繼續(xù)調(diào)用其中的方法,這樣,就形成了一個(gè)“鏈條”,通過“.”一個(gè)一個(gè)調(diào)用下去,這個(gè)在構(gòu)造函數(shù)中有具體體現(xiàn),其中有如下一條語句:

            if( window == this ) return new jQuery( a, c );

            這個(gè)就是為了返回一個(gè)jQuery對象,在首次調(diào)用jQuery( a, c )函數(shù)時(shí),this是等于window的,所以每次都會(huì)創(chuàng)建一個(gè)jQuery對象,更詳細(xì)的代碼分析見下:

          // jQuery的構(gòu)造函數(shù);
          var jQuery = function( a, c ) {
              
          // $(document).ready()的簡寫形式,只有在$(function(){})下才會(huì)執(zhí)行;
              if ( a && typeof a == "function" && jQuery.fn.ready ) return jQuery(document).ready(a);

              
          // 確保參數(shù)a非空,默認(rèn)值為document;
               a = a || jQuery.context || document;

              
          // 如果參數(shù)a是jQuery對象(a.jquery="1.0.3"),則克隆一個(gè)與a相同的jQuery對象;
              if ( a.jquery ) return jQuery( jQuery.merge( a, [] ) );

              
          // 從給定的參數(shù)c(要求c必須是jQuery對象)中查找a;
              if ( c && c.jquery ) return jQuery( c ).find( a );

              
          // 如果是初次調(diào)用$(),因?yàn)樵趙indow環(huán)境下,所以創(chuàng)建一個(gè)新的jQuery對象,如果去掉new則循環(huán)執(zhí)行;
              if ( window == this ) return new jQuery(a,c);

              
          // 分析HTML串,如“div<ul>p”;
              if ( a.constructor == String ) {
                  
          var m = /^[^<]*(<.+>)[^>]*$/.exec( a );
                  
          if ( m ) a = jQuery.clean( [ m[ 1 ] ] );
               }


              
          // 如果參數(shù)a是元素?cái)?shù)組,則要執(zhí)行jQery.merge(),否則要執(zhí)行jQuery.find();
              this.get( a.constructor == Array || a.length && !a.nodeType && a[0!= undefined && a[0].nodeType
                  
          ?  // 處理元素?cái)?shù)組;
                       jQuery.merge( a, [] )
                   :  
          // 查找相匹配的元素并保存;
                       jQuery.find( a, c ) );

              
          // 如果附加了另外的函數(shù),則在每個(gè)相匹配的jQuery對象上執(zhí)行這個(gè)函數(shù);
              var fn = arguments[ arguments.length - 1 ];
              
          if ( fn && typeof fn == "function" ) this.each( fn );

              
          return this;

          }
          //jQuery的結(jié)束;
          posted on 2008-02-20 18:04 vesung 閱讀(6729) 評論(0)  編輯  收藏 所屬分類: Ajax/html
          主站蜘蛛池模板: 宣汉县| 平阳县| 福鼎市| 西林县| 莱阳市| 定日县| 徐水县| 横峰县| 荣昌县| 日照市| 安徽省| 松阳县| 莎车县| 丰县| 始兴县| 聊城市| 太仓市| 会东县| 大同市| 湘阴县| 三河市| 荔浦县| 汽车| 泸溪县| 萨迦县| 扶余县| 渑池县| 昆明市| 杂多县| 阿克| 武功县| 富宁县| 泽普县| 开江县| 渝北区| 浠水县| 新巴尔虎右旗| 通道| 新建县| 罗甸县| 江津市|