JS的異步裝載

JS的裝載和執(zhí)行

首先,瀏覽器對JS的運(yùn)行分兩個(gè)特性:
1)載入后馬上執(zhí)行;
2)執(zhí)行后會阻塞后面的內(nèi)容(包括頁面的渲染、其他資源的下載等)
所以,有多個(gè)js文件要載入的時(shí)候,瀏覽器默認(rèn)是同步下載,即按順序一個(gè)一個(gè)下載下來,并依次執(zhí)行。
當(dāng)此時(shí),要操作DOM結(jié)點(diǎn)的時(shí)候,由于HTML被阻塞,DOM樹還沒生成,故此時(shí)如果引用document.getElementById這些操作時(shí),會報(bào)找不到的錯(cuò)誤。舉例:

test.js
  • 在head中引入的時(shí)候,頁面加載出來了,但會報(bào)錯(cuò),alert也沒有出現(xiàn):


    test.html

    執(zhí)行結(jié)果
  • 調(diào)整script標(biāo)簽的順序,到body標(biāo)簽后:
test.html
結(jié)果
F12查看

認(rèn)識DOMContentLoaded和load

先觸發(fā)DOMContentLoaded事件,后觸發(fā)load事件。
DOM文檔加載的步驟為:

解析HTML結(jié)構(gòu)。
加載外部腳本和樣式表文件。
解析并執(zhí)行腳本代碼。
DOM樹構(gòu)建完成。//DOMContentLoaded
加載圖片等外部文件。
頁面加載完畢。//load
在第4步,會觸發(fā)DOMContentLoaded事件。在第6步,觸發(fā)load事件。

defer和async

  • defer:IE上用的,會把腳本異步裝載,并且等到DOM裝載完畢(DOMContentLoaded)。多個(gè)defer的<script>也會按照其出現(xiàn)的順序執(zhí)行。

  • async:H5新的屬性。也會異步加載js腳本,但嚴(yán)格遵循“載入后立馬執(zhí)行”的特性,無法保證執(zhí)行順序和時(shí)機(jī)。
    所以這兩種都不會阻塞HTML的加載。

舉例:

  • 加入async(或者defer)后,頁面渲染不阻塞,腳本也順利執(zhí)行了(div中的文本123被獲取出來了)。


    test.html

    執(zhí)行結(jié)果

此外,還可以通過創(chuàng)建script,插入到DOM中,加載完畢后callBack來異步加載。

網(wǎng)上這篇帖子寫的不錯(cuò),可以參考一下:http://www.360doc.com/content/13/0620/12/1332348_294249608.shtml

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

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

  • 簡單介紹JavaScript的發(fā)展歷史 JavaScript因互聯(lián)網(wǎng)而生,回顧它的歷史要從瀏覽器的歷史講起。 19...
    _Dot912閱讀 594評論 0 3
  • Tif_Lib閱讀 502評論 0 1
  • 本文總結(jié)一下瀏覽器在 javascript 的加載方式。關(guān)鍵詞:異步加載(async loading),延遲加載(...
    4ea0af17fd67閱讀 1,108評論 0 2
  • JavaScript腳本對現(xiàn)代網(wǎng)站來說是必不可少的。當(dāng)用戶訪問站點(diǎn),需要下載各種資源,例如JS腳本,CSS,圖片,...
    張歆琳閱讀 9,353評論 0 24
  • 首先我們先來看一下Script標(biāo)簽的各項(xiàng)屬性: script標(biāo)簽也支持HTML中的全局屬性: 下面我們來看看一看j...
    tobAlier閱讀 1,264評論 0 2

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