首頁  >  文章  >  web前端  >  javascript可以是非同步載入嗎

javascript可以是非同步載入嗎

WBOY
WBOY原創
2022-03-10 15:51:211712瀏覽

JavaScript可以是非同步載入。非同步載入表示瀏覽器在下載執行JavaScript同時,也會繼續進行後續頁面的處理,可以優化腳本檔案的加載,提高頁面的載入速度;因為涉及到各個瀏覽器對解析腳本檔案的不同機制,因此更多的採用異步加載。

javascript可以是非同步載入嗎

本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

javascript可以是非同步載入嗎

1.首先要了解什麼是非同步與同步

同步載入:同步模式,又稱為阻塞模式,會阻止瀏覽器的後續處理,停止了後續的解析,因此停止了後續的檔案載入(如圖像)、渲染、程式碼執行。

非同步載入:非同步載入又叫非阻塞,瀏覽器在下載執行 js 同時,也會繼續進行後續頁面的處理。

通俗的來講:同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。

非同步就是你叫我,然後自己去吃飯,我得到消息後可能立即走,也可能等到下班才去吃飯。所以,要我請你吃飯就用同步的方法,要請我吃飯就用非同步的方法,這樣你可以省錢。

2.為什麼要用非同步

優化腳本檔案的載入來提高頁面的載入速度,一直是提高頁面載入速度很重要的一條。因為涉及到各個瀏覽器對解析腳本文件的不同機制,以及加載腳本會阻塞其他資源和文件的加載,因此更多的採用非同步加載。

3.如何用非同步

小編認為使用非同步載入有三種方式。

async ,加載完就執行,只能加載外部腳本,不能把js寫在script 標籤裡.

//1.async  只能加载外部脚本
<script src="js/index.js" async="async"></script>

defer 異步加載,但要等到dom文檔全部解析完才會被執行。只有IE能用內部外部js皆可使用

//2.defer  只能IE使用,文档解析完成以后才会去执行
<script src="js/index.js" defer="defer"></script>

依需求加載,考慮瀏覽器相容

//3.按需求加载,考虑浏览器兼容
    function loadScript(url,callback){
            var script = document.createElement("script");
            
            if(script.readyState){  IE浏览器兼容
                script.onreadystatechange = function(){
                    if(script.readyState == "complete" || script.readState == "loaded"){
                        callback()
                    }
                }
            }else{         大部分浏览器兼容
                script.onload = function(){  
                    callback()
                }
            }
            script.src = url;
            document.head.appendChild(script)
        }
        loadScript("08.js",function(){
            test()
        })
//外部js
function test(){
    console.log("hello world")
}

js載入時間軸

1、建立Document對象,開始解析web頁面。解析HTML元素和他們的文字內容後加入Element物件和Text節點到文件中。這個階段document.readyState = ‘loading’。

2、遇到link外部css,建立執行緒加載,並繼續解析文件。

3、遇到script外部js,並且沒有設定async、defer,瀏覽器加載,並阻塞,等待js加載完成並執行該腳本,然後繼續解析文件。

4、遇到script外部js,並且設定有async、defer,瀏覽器建立線程加載,並繼續解析文件。對於async屬性的腳本,腳本載入完成後立即執行。 (非同步禁止使用document.write())

5、遇到img等,先正常解析dom結構,然後瀏覽器非同步載入src,並繼續解析文件。

6、當文件解析完成,document.readyState = ‘interactive’。

7、文件解析完成後,所有設定有defer的腳本都會依照順序執行。 (注意與async的不同,但同樣禁止使用document.write());

8、document物件觸發DOMContentLoaded事件,這也標誌著程式執行從同步腳本執行階段,轉換為事件驅動階段。

9、當所有async的腳本載入完成並執行後、img等載入完成後,document.readyState = ‘complete’,window物件觸發load事件。

10、從此,以非同步回應方式處理使用者輸入、網路事件等。

相關推薦:javascript學習教學

以上是javascript可以是非同步載入嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn