JavaScript可以是非同步載入。非同步載入表示瀏覽器在下載執行JavaScript同時,也會繼續進行後續頁面的處理,可以優化腳本檔案的加載,提高頁面的載入速度;因為涉及到各個瀏覽器對解析腳本檔案的不同機制,因此更多的採用異步加載。
本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。
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中文網其他相關文章!