時間線
-
創建Document對象,開始解析web頁面。解析HTML元素和他們的文本內容後添加Element對象和Text節點到文檔中。這個階段 document.readyState = ‘loading’ 。
-
遇到link外部css,創建線程加載,並繼續解析文檔。
-
遇到script外部js,並且沒有設置async、defer,瀏覽器加載,並阻塞,等待js加載完成並執行該腳本,然後繼續解析文檔。
-
遇到script外部js,並且設置有async、defer,瀏覽器創建線程加載,並繼續解析文檔。 對於async屬性的腳本,腳本加載完成後立即執行。(禁止使用document.write())
-
遇到img等,先正常解析dom結構,然後瀏覽器異步加載src,並繼續解析文檔。
-
當文檔解析完成,document.readyState = ‘interactive’。
-
文檔解析完成後,所有設置有defer的腳本會按照順序執行。(禁止使用document.write());
-
document對象觸發DOMContentLoaded事件,這也標誌着程序執行從同步腳本執行階段,轉化爲事件驅動階段。
-
當所有async的腳本加載完成並執行後、img等加載完成後,document.readyState = ‘complete’,window對象觸發load事件。
-
從此,以異步響應方式處理用戶輸入、網絡事件等。