亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Jquery1.9.1源碼分析系列(六)延時對象應用之jQuery.ready

2019-11-20 11:10:52
字體:
來源:轉載
供稿:網友

還記不記得jQuery初始化函數jQuery.fn.init中有這樣是一個分支

//document ready簡便寫法$(function(){…})} else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector );}  所以$(fn)===$(document).ready(fn)?! 砜匆幌耲Query.fn.ready的源碼ready: function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this;}

  很明顯在jQuery.ready.promise函數中設置了延時,當延時對象解決的時候執行fn函數。

  主要的處理流程:

  創建一個延時對象,并將文檔準備好后的處理事件添加到該延時對象成功事件列表上。

jQuery.ready.promise = function( obj ) {  if ( !readyList ) {    readyList = jQuery.Deferred();    ...  } return readyList.promise( obj );}

  添加文檔準備狀態的監聽函數(jQuery.ready.promise函數片段)

 //標準瀏覽器支持DOMContentLoaded事件 } else if ( document.addEventListener ) {   //綁定DOMContentLoaded事件和響應函數,響應函數會解決延時   document.addEventListener( "DOMContentLoaded", completed, false );   //回退到window.onload事件綁定,所有的瀏覽器都支持   window.addEventListener( "load", completed, false ); //如果是IE事件模型 } else {   //確保在onload之前執行延時,可能時間比較遲,但是對于iframes來說比較安全   document.attachEvent( "onreadystatechange", completed );   //回退到window.onload事件綁定,所有的瀏覽器都支持   window.attachEvent( "onload", completed );   //如果IE并且不是一個frame   //不斷地檢查,看是否該文件已準備就緒   var top = false;   try {    top = window.frameElement == null && document.documentElement;   } catch(e) {}   if ( top && top.doScroll ) {    (function doScrollCheck() {     if ( !jQuery.isReady ) {      try {       // Use the trick by Diego Perini       // http://javascript.nwbox.com/IEContentLoaded/       top.doScroll("left");      } catch(e) {       return setTimeout( doScrollCheck, 50 );      }      //移除之前綁定的事件      detach();      //執行延遲      jQuery.ready();     }    })();   }  }

  一旦監聽到文檔準備完成,則調用jQuery.ready執行延時對象的成功回調列表:即所有通過jQuery.ready(fn)【或jQuery(fn)】方式添加的函數fn。

//ready事件處理函數completed = function( event ) { // readyState === "complete"在老版本IE上適用 if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {  detach();  jQuery.ready(); }},//清除ready事件綁定detach = function() { if ( document.addEventListener ) {  document.removeEventListener( "DOMContentLoaded", completed, false );  window.removeEventListener( "load", completed, false ); } else {  document.detachEvent( "onreadystatechange", completed );  window.detachEvent( "onload", completed ); }};//處理當DOM準備完成jQuery.ready: function( wait ) {       ...         //設置DOM已經準備好的標志       jQuery.isReady = true;    ...    //執行綁定的延時事件    readyList.resolveWith( document, [ jQuery ] );    //觸發任何綁定的就緒事件    if ( jQuery.fn.trigger ) {       jQuery( document ).trigger("ready").off("ready");    } }

   整個過程就是如此。其中有一些小的知識點整理一下。

a. 文檔加載狀態document.readyState

  document.readyState用來判斷文檔加載狀態,是一個只讀屬性,可能的值有:

  0-uninitialized:XML 對象被產生,但沒有任何文件被加載。
  1-loading:加載程序進行中,但文件尚未開始解析。
  2-loaded:部分的文件已經加載且進行解析,但對象模型尚未生效。
  3-interactive:僅對已加載的部分文件有效,在此情況下,對象模型是有效但只讀的。
  4-complete:文件已完全加載,代表加載成功。

  實例:

document.onreadystatechange = stateChange;//當頁面加載狀態改變的時候執行這個方法.function stateChange() {     if(document.readyState == "complete"){ //當頁面加載狀態為完全結束時進入         alert("文檔加載成功")     } }

  但是,老版本的Firefox并不支持document.readyState【最新的Firefox已經支持了】。所以想要兼容所有瀏覽器監聽文檔準備完成分兩種情況來處理:

  - 標準瀏覽器使用addEventListener添加DOMContentLoaded和load監聽,任何一個事件被觸發即可

  - 老版本IE瀏覽器使用attachEvent添加onreadystatechange和onload來監聽,任何一個被觸發,并且onreadystatechange時document.readyState === "complete"即可。

  jQuery的處理也就是如此了

jQuery.ready.promise = function(){  ...  //標準瀏覽器支持DOMContentLoaded事件  else if ( document.addEventListener ) {   //綁定DOMContentLoaded事件和響應函數,響應函數會解決延時   document.addEventListener( "DOMContentLoaded", completed, false );   //回退到window.onload事件綁定,所有的瀏覽器都支持   window.addEventListener( "load", completed, false ); //如果是IE事件模型 } else {   //確保在onload之前執行延時,可能時間比較遲,但是對于iframes來說比較安全   document.attachEvent( "onreadystatechange", completed );   //回退到window.onload事件綁定,所有的瀏覽器都支持   window.attachEvent( "onload", completed );       ...  }}//ready事件處理函數completed = function( event ) { // readyState === "complete"在老版本IE上適用 if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {  detach();  jQuery.ready(); }}

  b.doScroll檢測文檔加載完成

  這是Diego Perini 發現的一種檢測IE是否加載完成的方式。詳細鏈接

  原理是當頁面 DOM 未加載完成時調用 doScroll 方法時會產生異常。那么不斷的取檢測異常是否發生就可以知道文檔有沒有加載完成。當沒有發生異常,表明文檔加載完成了。          

 (function doScrollCheck() {     if ( !jQuery.isReady ) {      try {       // Use the trick by Diego Perini       // http://javascript.nwbox.com/IEContentLoaded/       top.doScroll("left");      } catch(e) {       return setTimeout( doScrollCheck, 50 );      }      //移除之前綁定的事件      detach();      //執行延遲      jQuery.ready();     }    })();

以上所述是武林網小編給大家介紹的Jquery1.9.1源碼分析系列(六)延時對象應用之jQuery.ready的全部內容,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日在线观看| 亚洲国产精品久久久久久| 精品国产依人香蕉在线精品| 91产国在线观看动作片喷水| 91成人天堂久久成人| 97精品一区二区三区| 国产亚洲欧美另类中文| 性欧美xxxx| 亚洲日本欧美日韩高观看| 国产日韩av在线| 亚洲视频在线观看网站| 国产精品久久久久久久久久小说| 欧美激情按摩在线| 性欧美亚洲xxxx乳在线观看| 俺去了亚洲欧美日韩| 国产精品高潮呻吟久久av黑人| 国产精品99久久久久久人| 国产精品一区二区久久国产| 亚洲精品www久久久| 亚洲久久久久久久久久久| 国产精品丝袜视频| 国产精品青青在线观看爽香蕉| 亚洲高清久久网| 成人福利在线视频| 中文国产成人精品久久一| 一区二区三区四区精品| 亚洲男人天堂2023| 欧美午夜精品久久久久久浪潮| xvideos成人免费中文版| 欧美性生交大片免网| 欧美日韩国产精品一区二区三区四区| 亚洲日本中文字幕免费在线不卡| 国外视频精品毛片| 青草青草久热精品视频在线观看| 欧美一区二区三区精品电影| 久久久成人av| 欧美疯狂做受xxxx高潮| 国产日韩中文字幕在线| 欧美日本中文字幕| 国产主播喷水一区二区| 欧美激情久久久| 久久久久久久久国产| 久久久久在线观看| 日韩美女视频中文字幕| 国产大片精品免费永久看nba| 日韩欧美高清在线视频| 日韩欧美中文字幕在线播放| 91日本视频在线| 久久久久久国产精品三级玉女聊斋| 国产精品稀缺呦系列在线| 欧美日韩综合视频网址| 精品亚洲一区二区三区四区五区| 亚洲精品大尺度| 中文字幕亚洲自拍| 欧美成人精品在线| 精品日本高清在线播放| 国产+人+亚洲| 国产精品一二三在线| 日本亚洲欧洲色α| 韩国欧美亚洲国产| 97在线视频免费| 夜夜嗨av色一区二区不卡| 97婷婷涩涩精品一区| 久久精品国产欧美激情| 国产日韩av在线| 国产精品v片在线观看不卡| 超碰精品一区二区三区乱码| 国产精品视频公开费视频| 亚洲欧美国产日韩中文字幕| 欧美极品少妇xxxxⅹ喷水| 欧美激情视频网址| 日韩一中文字幕| 欧美激情在线狂野欧美精品| 91在线无精精品一区二区| 美女黄色丝袜一区| 国产成人综合av| 日韩美女免费观看| 欧美大尺度在线观看| 成人午夜激情网| 国产mv免费观看入口亚洲| 色伦专区97中文字幕| 日本亚洲欧洲色α| 成人精品久久av网站| 亚洲精品之草原avav久久| 亚洲加勒比久久88色综合| 亚洲国产美女久久久久| 亚洲欧美视频在线| 国产成人综合久久| 欧美日韩国产一区二区三区| 国产欧美一区二区三区在线看| 国产精品av在线| 免费不卡欧美自拍视频| 91国产美女视频| 97视频在线观看亚洲| 亚洲国产精品悠悠久久琪琪| 亚洲第一天堂av| 亚洲在线www| 精品免费在线视频| 91久久国产精品| 中文字幕日韩欧美在线| 亚洲性生活视频| 国模视频一区二区| 97免费在线视频| 久久久日本电影| 国产女精品视频网站免费| 国产精品黄视频| 97在线免费视频| 亚洲国产精品成人va在线观看| 夜色77av精品影院| 久久久国产一区二区三区| 国产精品自拍偷拍视频| 国产成人精品久久二区二区| 久久香蕉精品香蕉| 日本久久亚洲电影| 国产精品久久久久久久app| 日韩欧美国产黄色| 自拍偷拍免费精品| 欧美激情亚洲综合一区| 亚洲色图五月天| 亚洲精品网址在线观看| 欧美一区二区三区免费观看| 亚洲国产精品久久久久秋霞不卡| 国产91精品青草社区| 国产精品久久久久久五月尺| 中文字幕欧美在线| 久热精品视频在线免费观看| 欧美激情第1页| 欧美一区三区三区高中清蜜桃| 亚洲理论片在线观看| 国产在线视频一区| 国产在线拍偷自揄拍精品| 欧美日韩免费网站| 欧美亚洲视频在线看网址| 亚洲第一精品久久忘忧草社区| 久久久久久亚洲精品中文字幕| 成人精品在线观看| 亚洲精品一区二区三区不| 欧美二区在线播放| 成人免费激情视频| 国产精品中文久久久久久久| 日韩欧美在线国产| 亚洲欧美另类自拍| 精品久久久久久久久久久久| 影音先锋欧美在线资源| 欧美日韩国产丝袜美女| 国产精品欧美久久久| 亚洲天堂成人在线视频| 欧美午夜激情视频| 久久久国产一区二区三区| 久久影视三级福利片| 亚洲第一区在线观看| 97在线精品视频| 久久99久久久久久久噜噜| 69久久夜色精品国产69乱青草| 国产精品白丝jk喷水视频一区| 日韩免费电影在线观看| 亚洲四色影视在线观看| 性色av香蕉一区二区| 日本午夜人人精品| 奇米影视亚洲狠狠色| 国模精品视频一区二区三区| 色噜噜狠狠狠综合曰曰曰88av| 亚洲精品97久久| 国内精品久久久久影院优|