頁面加載過程中的三個事件

頁面在加載的時候會先後觸發兩個事件:document的DOMContentLoaded,以及window.onload事件.

DOMContentLoaded

MDN上的解釋是當初始的 HTML 文檔被完全加載和解析完成之後,DOMContentLoaded 事件被觸發,而無需等待樣式表、圖像和子框架的完成加載。IE9及其以上版本兼容.
此時的document.readyState == ‘interactive’.

$(document).ready()
其實並不存在document.ready這樣的原生事件。在jQuery中,$(function(){})$(document).ready(function(){})相同,都是用來表示文檔加載完成,但是頁面的其他資源,例如<img>,<iframe>有可能未加載完成.
此時document.readyState == ‘interactive’ 或者是 ‘complete’
原生js實現 $(document).ready() 方法,其實就是監聽documnent.readyStateChange事件,查看是否document.readyState == ‘complete’。參考

window.onlaod
此時HTML文檔全部解析完成,依賴的所有資源都已經解析完成。
此時,document.readyState == ‘complete’

關於document.readyState
這個只讀屬性用來描述html文檔當前的加載狀態.有效的值有:
loading:加載中
interactive:文檔加載解析完畢,但是子資源可能還未加載完成.
complete:文檔加載解析完畢,全部資源加載完成.

HTML 文檔的解析和資源加載
瀏覽器對於html文檔裏面的所有的資源(類似於<img><link><script><iframe>)都是並行加載。主線程不會等到一個資源加載完纔開始加載下一個.它會同時開啓多個下載線程(可能是4-6後者N個,不同的瀏覽器並行下載數不一樣).而對於<script>來說就有些特殊,他的下載和執行都會阻塞主線程,也就是說當HTML文檔的解析遇到<script> 時候,瀏覽器就不會繼續往下解析html 文檔。後面的資源也不會開始下載。只有等到<script>加載執行完成後,主線程纔會繼續往下解析html 文檔。

這樣設計的考量是js文件有可能會修改DOM樹,所以穩妥的做法是先暫停html文檔的解析.在chrome 上,還有一種預解析的技術。就是在併發解析多個<script>標籤裏面的內容,如果發現某個<script>的內容不改變DOM樹,那麼主線程就會直接使用這個結果,否則就放棄,主線程自己再解析。

但是無論怎樣,<script> 都是按照在頁面中出現的順序來執行的。

ps:以下內容純屬胡說
對於<style><link>的加載和解析就完全是異步的.因爲除了主線程之外,每個頁面還有一個渲染線程.解析html文檔生成DOM樹和渲染頁面完全是並行的。

參考:
http://blog.csdn.net/talking12391239/article/details/21157263
https://www.cnblogs.com/daishuguang/p/4193432.html
https://www.cnblogs.com/Walker-lyl/p/5262075.html
http://blog.csdn.net/lxcao/article/details/52861953

如有紕漏,歡迎指出,反正我就是當筆記一樣給自己看的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章