<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      js便簽筆記(6)——jQuery中的ready()事件為何需要那么多代碼?

      前言:

      ready()事件的應用,是大家再熟悉不過的了,學jQuery的第一步,最最常見的代碼:

      jQuery(document).ready(function () { });
      jQuery(function () { });
      $(document).ready(function () { });
      $(function () { });

      以上四行代碼的目的和效果都一樣——待DOM加載完成之后,執行傳入的function函數。

      再對jquery稍微熟悉一點的朋友可能知道,這里的“待DOM加載完成”,不是window.onload事件,window.onload是指“DOM加載完成 + DOM相關的文件下載完成”。這里的“DOM加載完成”,不包括“DOM相關的文件加載完成”。相關的事件是:

      • DOMContentLoaded事件(IE9+以及其他瀏覽器)
      • onreadystatechange事件(IE9以下瀏覽器)

      問題就在這里。如果知道了這兩個事件,那么把傳入的function函數關聯到這兩個事件上就行了,而jquery中與ready相關的代碼洋洋灑灑的寫了那么多,至于上百行代碼。這是為何?

      原因在于以下幾點:

       

      2. 存儲結構——基于異步隊列設計:

      先看以下代碼:

              //應用ready事件
              $(function () {
                  alert(10);
              });
              $(function () {
                  alert(20);
              });
              $(function () {
                  alert(30);
              });

      以上代碼連續應用了三次ready方法,其實jquery是用本身的jquery.callbacks來處理的。主要代碼如下:

      readyList = jQuery.Callbacks( "once memory" );
      readyList.add( fn );
      readyList.fireWith( document, [ jQuery ] );

      "once":代表add進來的函數只被調用一次;

      "memory":代表一旦readylist被執行過一次,那么它后續添加進來的函數會立即按照執行時候的環境和參數執行。

       

      3. 巧妙的事件綁定:

      以IE9+和其他瀏覽器支持的DOMContentLoaded為例。先看代碼:

              // Mozilla, Opera and webkit nightlies currently support this event
              if ( document.addEventListener ) {
                  // Use the handy event callback
                  document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
      
                  // A fallback to window.onload, that will always work
                  window.addEventListener( "load", jQuery.ready, false );
              }
      
         DOMContentLoaded
      = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); };

      根據以上代碼可見,最終DOMContented事件執行的,其實是jQUery.ready()這個工具函數。(注意,jquery.ready()和jquery(document).raedy()不一樣!!,前者是工具函數,后者是實例函數。)

      這里是通過定義一個DOMContentLoaded函數作為橋梁來執行jquery.ready()函數的,這樣做的目的就是為了即使的remove掉document的DOMContentLoaded事件的引用。

      document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
      document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );

      單獨把這兩行摘出來,可以看明白,add完了之后,接著remove掉了,在這中間,巧妙的執行了jquery.ready(),這種用法值得學習!

      反過來,如果像以下代碼那么樣實現,document的DOMContentLoaded事件的引用將無法及時刪除。

      //反例
      document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );

       

       

      另外,除了通過瀏覽器的DOMContentLoaded/onreadystatechange方法可以調用jquery.ready()函數之外,還有一種巧妙的方式調用jquery.ready()函數。

      在IE9以下的瀏覽器中,如果當前頁面是頂層(即沒有包含在iframe和friame元素中),調用html.doScroll(),直到不拋出異常,即可調用jquery.ready()函數。

       1     if ( document.documentElement.doScroll && toplevel ) {
       2                 doScrollCheck();
       3             }
       4             
       5     /*省略*/
       6     
       7     try {
       8         // If IE is used, use the trick by Diego Perini
       9         // http://javascript.nwbox.com/IEContentLoaded/
      10         document.documentElement.doScroll("left");
      11     } catch(e) {
      12         setTimeout( doScrollCheck, 1 );
      13         return;
      14     }
      15 
      16     // and execute any waiting functions
      17     jQuery.ready();

       

      4. 事件執行:

      上文中講到,可以通過瀏覽器的DOMContentLoaded/onreadystatechange事件,以及對html.doScroll()的檢測來調用jquery.ready()工具函數,jquery.ready()最終將會調用異步隊列的firewith()方法觸發傳入的所有事件。如果是通過js手動調用,也可以通過jquery事件系統來調用。

      readyList.fireWith( document, [ jQuery ] );
      
      if ( jQuery.fn.trigger ) {
                      jQuery( document ).trigger( "ready" ).off( "ready" );
                  }

       

      其實這其中還有個jquery.holdready()方法用來延遲調用,不過比較簡單,也不常用,此處不說了。

       

      5. 總結:

      可見,jQuery中的ready()事件并不是我們看起來那么簡單,了解其原理的同時,也應該想想我們在自己設計系統的時候,考慮的時候全面。

      • 它用到了異步隊列,使得使用者可以多次調用,順序執行;
      • 它的事件綁定考慮到了各種情況,而又充分考慮了資源的釋放;
      • 它同時考慮了瀏覽器調用的情況,和js手動調用的情況。

      個人感受:想了解js到底該怎么用,了解js的源碼和設計,是一個捷徑。

       

      posted @ 2014-04-13 22:06  王福朋  閱讀(3151)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产精品无码av天天爽播放器| 国产精品不卡一二三区| 人妻被猛烈进入中文字幕| 777奇米四色成人影视色区| 久久成人伊人欧洲精品| 你懂的亚洲一区二区三区| 中文字幕免费不卡二区| 国产精品污双胞胎在线观看| 日本免费人成视频在线观看| 三上悠亚久久精品| 丰镇市| 亚洲国产制服丝袜高清在线| 肉大捧一进一出免费视频| 国产果冻豆传媒麻婆| 女同性恋一区二区三区视频| 亚洲天堂伊人久久a成人| caoporn免费视频公开| 国内精品伊人久久久久av| 国产偷拍自拍视频在线观看| 99久久国产综合精品女图图等你| 亚洲人成电影在线天堂色| 精品人妻少妇一区二区三区在线| 最新日韩精品中文字幕| 凤山市| 国产99视频精品免费视频76| 欧洲免费一区二区三区视频| 131mm少妇做爰视频| 中国女人熟毛茸茸A毛片| 99久久激情国产精品| 天天爱天天做天天爽夜夜揉| 亚洲午夜av一区二区| 中文字幕人妻精品在线| 亚洲精品国精品久久99热| 精品国产精品国产偷麻豆| 国产精品自拍午夜福利| 石林| 无码专区 人妻系列 在线| 精品一区二区成人精品| 蜜桃无码一区二区三区| 亚洲欧美人成人综合在线播放| 野花社区www视频日本|