日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异步加载js的三种方法

發布時間:2024/10/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异步加载js的三种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

js加載時間線

  它是根據js出生的那一刻開始記錄的一系列瀏覽器按照順序做的事,形容的就是加載順序,可以用來優化什么東西,理論基礎,背下來.
  1、創建Document對象,開始解析web頁面。解析HTML元素和他們的文本內容后添加Element對象和Text節點到文檔中。這個階段document.readyState = 'loading'。(生成document對象,document狀態位變為loading)
  2、遇到link外部css,創建線程加載,并繼續解析文檔。
  3、遇到script外部js,并且沒有設置async、defer,瀏覽器加載,并阻塞,等待js加載完成并執行該腳本,然后繼續解析文檔。
  4、遇到script外部js,并且設置有async、defer,瀏覽器創建線程加載,并繼續解析文檔。 對于async屬性的腳本,腳本加載完成后立即執行。(異步禁止使用document.write())
document.write():特別特殊他是把里面的東西當成HTML文檔輸出到頁面里去,但是有一點就是,有的時候,當你整個文檔全部都解析的差不多的時候再用document.write()的話會把你之前所有的文檔流都清空,用它里面的文檔流代替
例:整個頁面只顯示a,這里的document.write();在這里有消除文檔流的功能,連script都消除了。
<div style="height:100px;width:100px;background-color:red;"></div>
<script type="text/javascript">
? ? window.onload = function(){
? ? ? ? document.write('a');
? ? }
</script>
  5、遇到img等,先正常解析dom結構,然后瀏覽器異步加載src,并繼續解析文檔。
  6、當文檔解析完成,document.readyState = 'interactive'。
先解析完,再加載完,然后狀態位變為interactive(活躍)
查看狀態位的轉換:
? ? console.log(document.readyState);
? ? document.onreadystatechange = function(){
? ? ? ? console.log(document.readyState);
? ? }
  7、文檔解析完成后,所有設置有defer的腳本會按照順序執行。(注意與async的不同,但同樣禁止使用(document.write());
  8、document對象觸發DOMContentLoaded事件,這也標志著程序執行從同步腳本執行階段,轉化為事件驅動階段。
例1:同時打印出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和下面這個的區別
? ? $(document).ready(function(){
?? ?//當DOM解析完就執行的部分(不用加載完,加載完是給用戶看的,對于我們來說解析完就可以操作了)
?? ?/*它的原理就是interactive和DOMContentLoaded事件*/
? ? })
區別就是:window.onload滿需要都加載完,但是它解析完就可以操作了(這是jQuery的方法)
例3:當把script放在上面時候最好這樣寫,不要寫onload,千萬不要寫onload,但是最好的方法還是寫在下面
<head>
? ? <meta charset="UTF-8">
? ? <title>lottery</title>
? ? <script type="text/javascript">
? ? ? ? document.addEventListener('DOMContentLoaded',function(){
? ? ? ? ? ? var div = document.getElementsByTagName('div')[0];
? ? ? ? ? ? console.log(div);
? ? ? ? },false)
? ? </script>
? ? script標簽寫在上面又能處理下面的代碼,而且效率還高,因為登高DOM解析完就執行,而不是DOM加載完
</head>
//script標簽寫在上面又能處理下面的代碼,而且效率還高,因為登高DOM解析完就執行,而不是DOM加載完
  9、當所有async的腳本加載完成并執行后、img等加載完成后,document.readyState = 'complete',window對象觸發load事件。
  10、從此,以異步響應方式處理用戶輸入、網絡事件等。
總結就是三個點:先生成document對象,代表js可以運行了,第二步就是文檔解析完了,第三步就是文檔加載完了并且執行完了
---------------------
作者:LFY836126
來源:CSDN
原文:https://blog.csdn.net/lfy836126/article/details/82669450

?


?

下面我們看看異步加載js的三種方式:

  異步加載js的方法:

  1)async? ?HTML5的屬性,讓JavaScript代碼進行異步加載

<script type="text/javascript" src="05.js" async="async"> </script>

?

  2)defer? ?老版本IE專用

<script type="text/javascript" defer="defer"> </script>

?

  3)動態的創建script的標簽(可以解決兼容h5以及低版本ie的問題),代碼如下:

<script type="text/javascript">function asyncLoaded(url,callback){var script = document.createElement("script"); // script.src = url; 假如說網速非常好,直接執行完成了,后面就監聽不到狀態的改變了if(script.readyState){script.onreadystatechange = function(){if(script.readyState == "complete" || script.readyState =="loaded"){ // 執行某個函數 callback()}}}else{script.onload = function(){ // 執行某個函數 callback()}}script.src = url; //異步的過程 document.head.appendChild(script) }asyncLoaded("05.js",function(){fn()          //05.js中的函數})</script>

?

總結

以上是生活随笔為你收集整理的异步加载js的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。