DOM ready原理

DOM ready這個已經(jīng)有很多人說了,說的也很詳細,這里簡單說下。利用問題的形式展開~

問:為什么需要dom ready?

答:我們需要在頁面加載后,再進行一些js操作,例如:綁定事件,操作DOM。

問:為什么不用window.onload事件?

答:window.onload要等頁面內(nèi)的所有資源都加載完才觸發(fā),像圖片、音頻等,等待的時間會比較長。

問:那直接用DOMContentLoaded就好,還墨跡這么多?

答:DOMContentLoaded本來是FireFox的私有事件,F(xiàn)F3版本才完整支持,webkit系列的在525版本后才增加這個事件的支持,IE系列的在IE9才開始支持。
可以看看它的兼容性,如下:

compatibility.png

問:IE在不支持DOMContentLoaded事件的情況下,如何判斷DOM ready

  • 方法一:往頁面內(nèi)添加script標簽,添加defer屬性,通過監(jiān)聽這個腳本的readyState,當腳本加載完成時就判斷DOM ready了。

    但這個方法的缺點是:當頁面里有iframe的時候,會等iframe里所有的資源加載完才觸發(fā),和onload差不多。

  • 方法二:通過輪詢來調(diào)用document.documentElement.doScroll方法,調(diào)用成功表示DOM ready了。

所以,IE下用方法二來判斷DOM ready。

問:document.documentElement.doScroll是個什么鬼?

答:IE下一些事件只有在DOM準備好后才能觸發(fā),document.documentElement.doScroll就是這樣一個事件。通過判斷調(diào)用是否成功,進而判斷DOM是否加載完。
這個hack最早是外國的大牛發(fā)現(xiàn)的,詳情可以看這里。

問:IE的判斷完了,那webkit系列的在525版本之前的怎么判斷?

答:通過輪詢判斷document.readyState,當readyStateloaded/complete的時候,判斷DOM加載完畢。

問:你說的我都懂,有沒有什么現(xiàn)成的庫?

答:基本上比較流行的庫都有實現(xiàn)的,像jQuery/Zepto/Prototype/Moontools/YUI等,只是每個庫實現(xiàn)的方式都不同。

github上也有個比較出名的庫domready,現(xiàn)在它的主分支是針對有DOMContentLoaded事件的瀏覽器,兼容性如下:

  • IE9+
  • Firefox 4+
  • Safari 3+
  • Chrome *
  • Opera *

不過它的0.3.0分支是兼容多種瀏覽器的,兼容性如下:

  • IE6+
  • Firefox 2+
  • Safari 3+
  • Chrome *
  • Opera *

最后

如果是用在移動端的話,可以放心的通過DOMContentLoaded事件來判斷。PC的話,國內(nèi)現(xiàn)在的環(huán)境,還是乖乖用兼容版本吧。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容