1、創(chuàng)建Document對(duì)象,開始解析web頁(yè)面。解析HTML元素和他們的文本內(nèi)容后添加Element對(duì)象和Text節(jié)點(diǎn)到文檔中。這個(gè)階段document.readyState = 'loading'监憎。
2、遇到link外部css婶溯,創(chuàng)建線程加載鲸阔,并繼續(xù)解析文檔。
3迄委、遇到script外部js褐筛,并且沒有設(shè)置async、defer叙身,瀏覽器加載渔扎,并阻塞,等待js加載完成并執(zhí)行該腳本信轿,然后繼續(xù)解析文檔晃痴。
4、遇到script外部js财忽,并且設(shè)置有async倘核、defer,瀏覽器創(chuàng)建線程加載即彪,并繼續(xù)解析文檔紧唱。
對(duì)于async屬性的腳本,腳本加載完成后立即執(zhí)行。(異步禁止使用document.write())
5漏益、遇到img等蛹锰,先正常解析dom結(jié)構(gòu),然后瀏覽器異步加載src绰疤,并繼續(xù)解析文檔铜犬。
6、當(dāng)文檔解析完成峦睡,document.readyState = 'interactive'翎苫。
7、文檔解析完成后榨了,所有設(shè)置有defer的腳本會(huì)按照順序執(zhí)行。(注意與async的不同,但同樣禁止使用document.write());
8攘蔽、document對(duì)象觸發(fā)DOMContentLoaded事件龙屉,這也標(biāo)志著程序執(zhí)行從同步腳本執(zhí)行階段,轉(zhuǎn)化為事件驅(qū)動(dòng)階段满俗。
9转捕、當(dāng)所有async的腳本加載完成并執(zhí)行后、img等加載完成后唆垃,document.readyState = 'complete'五芝,window對(duì)象觸發(fā)load事件。
10辕万、從此枢步,以異步響應(yīng)方式處理用戶輸入、網(wǎng)絡(luò)事件等渐尿。
想將script標(biāo)簽寫在body前面
document.addEventListener('DOMContentLoaded',function () {
console.log('s');
},false);
這樣寫醉途,讓該js執(zhí)行在解析web頁(yè)面后,不像window.onload那樣等到全部解析完再執(zhí)行砖茸,效率更高隘擎。