資源載入和頁面事件
理想的頁面載入方式
- 解析HTML結構。
- 載入并解析外部腳本。
- DOM樹建構完成,運作腳本。//DOMInteractive –> DOMContentLoaded
- 載入圖檔、樣式表檔案等外部檔案。
- 頁面載入完成。//window.onload
涉及到的事件
-
window.onload:
當頁面全部載入完成(包含全部資源)
-
document.onload:
當整個html文檔載入的時候就觸發了。也就是在body元素載入之前就開始運作了
-
DOMContentLoaded:
當頁面的DOM樹解析好而且須要等待JS運作完才觸發
DOMContentLoaded事件不直接等待CSS檔案、圖檔的載入完成
-
onreadytstatechange:
當對象狀态變更時觸發這個事件,一旦document的readyState屬性發生變化就會觸發
defer和async
-
沒有defer和async
浏覽器會馬上載入并運作指定的腳本,不等待興許載入的文檔元素,讀到就載入并運作。
當載入腳本時會堵塞頁面的渲染。
-
有async
載入和渲染興許文檔元素的過程将和腳本的載入與運作并行進行。展現出來就是異步。
async JS一旦下載下傳好了就會運作,是以非常有可能不是依照原本的順序來運作的。
假設腳本前後有依賴性。用async。就非常有可能出錯。
-
有defer
載入興許文檔元素的過程将和腳本的載入并行進行。
可是腳本的運作要在全部元素解析完成之後。DOMContentLoaded事件觸發之前完成。
defer JS在DOMInteractive後運作。一旦運作完defer JS。就會觸發DOMContentLoaded。
也就是說defer腳本總是在DOMInteractive事件與DOMContentLoaded事件之間的時間運作。
defer JS在html頁面解析完成之後再去運作,也就是相似于把這個腳本放在了頁面底部。
DOM的載入與解析
-
DOMLoading
浏覽器開始解析dom樹的時間點
-
DOMInteractive
表示浏覽器已經解析好dom樹了。
-
DOMContentLoaded
同步的JS已經運作完成了。
load的實作
作用:監控整個文檔(包含資源)是否載入完成。全部資源載入完成後觸發
原生js寫法:
window.onload = function(){
}
$(document).load(function(){
});
document.ready的實作
document.ready = function(callback) {
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', function() {
document.removeEventListener('DOMContentLoaded', arguments.callee, false);
callback();
}, false);
}else if (document.attachEvent) {// 相容ie
document.attachEvent('onreadytstatechange', function() {
if (document.readyState == "complete") {
document.detachEvent("onreadystatechange", arguments.callee);
callback();
}
});
}
}
$(function(){
});
$(document).ready(function(){
});
//jquery中默覺得document對象
$().ready(function(){
});