您好,登錄后才能下訂單哦!
這篇文章主要介紹了異步加載js的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
js加載時(shí)間線 :
它是根據(jù)js出生的那一刻開(kāi)始記錄的一系列瀏覽器按照順序做的事,形容的就是加載順序,可以用來(lái)優(yōu)化什么東西,理論基礎(chǔ),背下來(lái).
1、創(chuàng)建Document對(duì)象,開(kāi)始解析web頁(yè)面。解析HTML元素和他們的文本內(nèi)容后添加Element對(duì)象和Text節(jié)點(diǎn)到文檔中。這個(gè)階段document.readyState = 'loading'。(生成document對(duì)象,document狀態(tài)位變?yōu)閘oading)
2、遇到link外部css,創(chuàng)建線程加載,并繼續(xù)解析文檔。
3、遇到script外部js,并且沒(méi)有設(shè)置async、defer,瀏覽器加載,并阻塞,等待js加載完成并執(zhí)行該腳本,然后繼續(xù)解析文檔。
4、遇到script外部js,并且設(shè)置有async、defer,瀏覽器創(chuàng)建線程加載,并繼續(xù)解析文檔。 對(duì)于async屬性的腳本,腳本加載完成后立即執(zhí)行。(異步禁止使用document.write())
document.write():特別特殊他是把里面的東西當(dāng)成HTML文檔輸出到頁(yè)面里去,但是有一點(diǎn)就是,有的時(shí)候,當(dāng)你整個(gè)文檔全部都解析的差不多的時(shí)候再用document.write()的話會(huì)把你之前所有的文檔流都清空,用它里面的文檔流代替
例:整個(gè)頁(yè)面只顯示a,這里的document.write();在這里有消除文檔流的功能,連script都消除了。
<p style="height:100px;width:100px;background-color:red;"></p>
<script type="text/javascript"> window.onload = function(){ document.write('a'); } </script>
5、遇到img等,先正常解析dom結(jié)構(gòu),然后瀏覽器異步加載src,并繼續(xù)解析文檔。
6、當(dāng)文檔解析完成,document.readyState = 'interactive'。
先解析完,再加載完,然后狀態(tài)位變?yōu)閕nteractive(活躍)
查看狀態(tài)位的轉(zhuǎn)換:
console.log(document.readyState); document.onreadystatechange = function(){ console.log(document.readyState); }
7、文檔解析完成后,所有設(shè)置有defer的腳本會(huì)按照順序執(zhí)行。(注意與async的不同,但同樣禁止使用(document.write());
8、document對(duì)象觸發(fā)DOMContentLoaded事件,這也標(biāo)志著程序執(zhí)行從同步腳本執(zhí)行階段,轉(zhuǎn)化為事件驅(qū)動(dòng)階段。
例1:同時(shí)打印出a和complete,而且onDOMContentLoaded是不好使的,只有綁定在addEventListener才好用。
console.log(document.readyState); document.onreadystatechange = function(){ console.log(document.readyState); } document.addEventListener('DOMContentLoaded',function(){ console.log('a'); },false)
例2:window.onload和下面這個(gè)的區(qū)別
$(document).ready(function(){ //當(dāng)DOM解析完就執(zhí)行的部分(不用加載完,加載完是給用戶(hù)看的,對(duì)于我們來(lái)說(shuō)解析完就可以操作了) /*它的原理就是interactive和DOMContentLoaded事件*/ })
區(qū)別就是:window.onload滿(mǎn)需要都加載完,但是它解析完就可以操作了(這是jQuery的方法)
例3:當(dāng)把script放在上面時(shí)候最好這樣寫(xiě),不要寫(xiě)onload,千萬(wàn)不要寫(xiě)onload,但是最好的方法還是寫(xiě)在下面
<head> <meta charset="UTF-8"> <title>lottery</title> <script type="text/javascript"> document.addEventListener('DOMContentLoaded',function(){ var p = document.getElementsByTagName('p')[0]; console.log(p); },false) </script> script標(biāo)簽寫(xiě)在上面又能處理下面的代碼,而且效率還高,因?yàn)榈歉逥OM解析完就執(zhí)行,而不是DOM加載完 </head> //script標(biāo)簽寫(xiě)在上面又能處理下面的代碼,而且效率還高,因?yàn)榈歉逥OM解析完就執(zhí)行,而不是DOM加載完
9、當(dāng)所有async的腳本加載完成并執(zhí)行后、img等加載完成后,document.readyState = 'complete',window對(duì)象觸發(fā)load事件。
10、從此,以異步響應(yīng)方式處理用戶(hù)輸入、網(wǎng)絡(luò)事件等。
總結(jié)就是三個(gè)點(diǎn):先生成document對(duì)象,代表js可以運(yùn)行了,第二步就是文檔解析完了,第三步就是文檔加載完了并且執(zhí)行完了
下面我們看看異步加載js的三種方式:
異步加載js的方法:
1)、async HTML5的屬性,讓JavaScript代碼進(jìn)行異步加載
<script type="text/javascript" src="05.js" async="async"></script>
2)defer 老版本IE專(zhuān)用
<script type="text/javascript" defer="defer"></script>
3)動(dòng)態(tài)的創(chuàng)建script的標(biāo)簽(可以解決兼容h6以及低版本ie的問(wèn)題),代碼如下:
<script type="text/javascript"> function asyncLoaded(url,callback){ var script = document.createElement("script"); // script.src = url; 假如說(shuō)網(wǎng)速非常好,直接執(zhí)行完成了,后面就監(jiān)聽(tīng)不到狀態(tài)的改變了 if(script.readyState){ script.onreadystatechange = function(){ if(script.readyState == "complete" || script.readyState =="loaded"){ // 執(zhí)行某個(gè)函數(shù) callback() } } }else{ script.onload = function(){ // 執(zhí)行某個(gè)函數(shù) callback() } } script.src = url; //異步的過(guò)程 document.head.appendChild(script) } asyncLoaded("05.js",function(){ fn() //05.js中的函數(shù) }) </script>
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享異步加載js的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。