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才開始支持。
可以看看它的兼容性,如下:

問: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,當readyState為loaded/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)境,還是乖乖用兼容版本吧。
參考: