javascript的domReady

來源:互聯網
上載者:User

基本上每個庫都有這東西,因為如果要對頁面上的元素進行操作,我們必須等到頁面載入了這個元素才行,否則會報錯,但是我們很能判定某個元素是否已載入,但我們可以判定頁面是否載入,這就是我們經常把代碼放到window.onload = function(){}之中的緣由。但window.onload事件是待到頁面上的所有資源被載入才啟用,如果頁面上有許多圖片,音樂或falsh,而我們要操作的元素在的它們的下方呢?因此,W3C做了少有幾樁好事,搞了DOMContentLoaded與addEventListener,可能也不是他們搞的,把某瀏覽器的私人實現蓋上個大印,標明它是標準罷了,如safari的canvas,IE的getBoundingClientRect……DOMContentLoaded是DOM樹完成時啟用的事件,addEventListener支援多重載入與冒泡捕獲。IE沒有這東西,我在《javascript的事件載入》基本給出它的雛形了(註:昨天重寫了該文),本文將在它的基礎上進行進一步的封裝與改進,如setTimeout改為零秒延遲,清除setTimeout,執行完載入後把載入函數清除掉,對IE架構結構的頁面進行更安全的設定……最重要的是修正下面網友 wbkt2t 提到的在IE中的失誤!。晚上再次更新,發現doScroll並沒有想象中的快,比不上script defer……

IE6的資料:

IE8的資料:

綜合執行順序為:

  1. oncontentready,這時DOM樹完成
  2. script defer,這時開始執行設定了defer屬性的script
  3. ondocumentready complete,這時可以使用HTC組件與XHR
  4. html.doScroll 這時可以讓HTML元素使用doScroll方法
  5. window.onload 這時圖片flash等資源都載入完畢
      new function(){        dom = [];        dom.isReady = false;        dom.isFunction = function(obj){          return Object.prototype.toString.call(obj) === "[object Function]";        }        dom.Ready = function(fn){          dom.initReady();//如果沒有建成DOM樹,則走第二步,儲存起來一起殺          if(dom.isFunction(fn)){            if(dom.isReady){              fn();//如果已經建成DOM,則來一個殺一個            }else{              dom.push(fn);//儲存載入事件            }          }        }        dom.fireReady =function(){          if (dom.isReady)  return;          dom.isReady = true;          for(var i=0,n=dom.length;i<n;i++){            var fn = dom[i];            fn();          }          dom.length = 0;//清空事件        }        dom.initReady = function(){          if (document.addEventListener) {            document.addEventListener( "DOMContentLoaded", function(){              document.removeEventListener( "DOMContentLoaded", arguments.callee, false );//清除載入函數              dom.fireReady();            }, false );          }else{            if (document.getElementById) {              document.write("<script id=\"ie-domReady\" defer='defer'src=\"//:\"><\/script>");              document.getElementById("ie-domReady").onreadystatechange = function() {                if (this.readyState === "complete") {                  dom.fireReady();                  this.onreadystatechange = null;                  this.parentNode.removeChild(this)                }              };            }          }        }      }

使用方法:

      dom.Ready(function(){        alert("我的domReady!")      });      dom.Ready(function(){        alert("我的domReady測試多重載入1!")      });      dom.Ready(function(){        alert("我的domReady測試多重載入2!")      });      dom.Ready(function(){        alert(document.getElementById("test").innerHTML)      });

<br /><!doctype html><br /><html dir="ltr" lang="zh-CN"><br /> <head id="head"><br /> <meta charset="utf-8"/><br /> <title>jQuery的domReady </title></p><p> <script type="text/javascript"><br /> new function(){<br /> dom = [];<br /> dom.isReady = false;<br /> dom.isFunction = function(obj){<br /> return Object.prototype.toString.call(obj) === "[object Function]";<br /> }<br /> dom.Ready = function(fn){<br /> dom.initReady();//如果沒有建成DOM樹,則走第二步,儲存起來一起殺<br /> if(dom.isFunction(fn)){<br /> if(dom.isReady){<br /> fn();//如果已經建成DOM,則來一個殺一個<br /> }else{<br /> dom.push(fn);//儲存載入事件<br /> }<br /> }<br /> }<br /> dom.fireReady =function(){<br /> if (dom.isReady) return;<br /> dom.isReady = true;<br /> for(var i=0,n=dom.length;i<n;i++){<br /> var fn = dom[i];<br /> fn();<br /> }<br /> dom.length = 0;//清空事件<br /> }<br /> dom.initReady = function(){<br /> if (document.addEventListener) {<br /> document.addEventListener( "DOMContentLoaded", function(){<br /> document.removeEventListener( "DOMContentLoaded", arguments.callee, false );//清除載入函數<br /> dom.fireReady();<br /> }, false );<br /> }else{<br /> if (document.getElementById) {<br /> document.write("<script id=\"ie-domReady\" defer='defer'src=\"//:\"><\/script>");<br /> document.getElementById("ie-domReady").onreadystatechange = function() {<br /> if (this.readyState === "complete") {<br /> dom.fireReady();<br /> this.onreadystatechange = null;<br /> this.parentNode.removeChild(this)<br /> }<br /> };<br /> }<br /> }<br /> }<br /> }</p><p> dom.Ready(function(){<br /> alert("我的domReady!")<br /> });<br /> dom.Ready(function(){<br /> alert("我的domReady測試多重載入1!")<br /> });<br /> dom.Ready(function(){<br /> alert("我的domReady測試多重載入2!")<br /> });<br /> dom.Ready(function(){<br /> alert(document.getElementById("test").innerHTML)<br /> });</p><p> window.onload = function(){<br /> alert("這是onload事件!")<br /> };<br /> </script><br /> </head><br /> <body><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s005.jpg" alt="圖片1" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s006.jpg" alt="圖片2" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s007.jpg" alt="圖片3" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s008.jpg" alt="圖片4" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s009.jpg" alt="圖片5" /><br /> <table class="filament_table" cellspacing="0" width="700" rules="cols" ><br /> <col class="grey" width="25%"></col><br /> <col class="yellow"></col><br /> <thead><br /> <tr><br /> <th><br /> 參數<br /> </th><br /> <th><br /> 描述<br /> </th><br /> </tr><br /> </thead><br /> <tbody><br /> <tr><br /> <td><br /> scrollbarDown<br /> </td><br /> <td><br /> Default. Down scroll arrow is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarHThumb<br /> </td><br /> <td><br /> Horizontal scroll thumb or box is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarLeft<br /> </td><br /> <td><br /> Left scroll arrow is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarPageDown<br /> </td><br /> <td><br /> Page-down scroll bar shaft is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarPageLeft<br /> </td><br /> <td><br /> Page-left scroll bar shaft is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarPageRight<br /> </td><br /> <td><br /> Page-right scroll bar shaft is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarPageUp<br /> </td><br /> <td><br /> Page-up scroll bar shaft is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarRight<br /> </td><br /> <td><br /> Right scroll arrow is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarUp<br /> </td><br /> <td><br /> Up scroll arrow is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> scrollbarVThumb<br /> </td><br /> <td><br /> Vertical scroll thumb or box is at the specified location<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> down<br /> </td><br /> <td><br /> Composite reference to scrollbarDown<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> left<br /> </td><br /> <td><br /> Composite reference to scrollbarLeft<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> pageDown<br /> </td><br /> <td><br /> Composite reference to scrollbarPageDown.<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> pageLeft<br /> </td><br /> <td><br /> Composite reference to scrollbarPageLeft.<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> pageRight<br /> </td><br /> <td><br /> Composite reference to scrollbarPageRight.<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> pageUp<br /> </td><br /> <td><br /> Composite reference to scrollbarPageUp.<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> right<br /> </td><br /> <td><br /> Composite reference to scrollbarRight.<br /> </td><br /> </tr><br /> <tr><br /> <td><br /> up<br /> </td><br /> <td><br /> Composite reference to scrollbarUp.<br /> </td><br /> </tr><br /> </tbody><br /> </table></p><p> <p id="test">我們添加了些圖片與表格延緩頁面的載入速度</p><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s015.jpg" alt="圖片1" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s016.jpg" alt="圖片2" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s017.jpg" alt="圖片3" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s018.jpg" alt="圖片4" /><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s019.jpg" alt="圖片5" /><br /> </body><br /></html></p><p>

運行代碼

以下,更新前一些有用的東西,捨不得丟棄,暫時還留著。

用於判定是否為頂層window:

      //方法一      var topwindow = self === self.top      //方法二      var topwindow = false;      try {        topwindow = window.frameElement == null;      } catch(e){}

推薦第一種,第二種必須要待到document.body形成之時才能用,有關frameElement 的資料詳見這裡與這裡。 frameElement要求當前window是一個 frame 或 iframe才存在,否則返回null。不過第一種要注意一下,在IE 下,top, self, parent 和對應的 window 並不全等。見下面測試:

<br />alert(window === window.top); // 應該為true<br />alert(self === self.top); // 應該為true<br />alert(self === window.top); // 應該為true<br />alert(self === window); // 應該為true<br />alert(window == window.top); // 應該為true<br />alert(typeof self === typeof window); // 應該為true<br />alert(self == window); // 應該為true<br />

運行代碼

一些有用的連結:

http://p2b.jp/200805-events-order

http://tanny.ica.com/ICA/TKO/test.nsf/DOMContentLoaded.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.