最近對於文檔加載方法有了新的理解,所以整理成一片簡記,方便之後進行查閱。
先來一段Html,做爲咱們研究的基礎吧。css
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="./canvas.css"> <title></title> </head> <body> <img src="https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike180%2C5%2C5%2C180%2C60/sign=f8a24d9b9545d688b70fbaf6c5ab167b/5bafa40f4bfbfbed903bb2d77ff0f736afc31f33.jpg" alt=""> <script> var img = document.querySelector("img"); var body = document.querySelector("body"); var css = document.querySelector("link"); // 爲了瞭解DOM樹和渲染樹構建完成後觸發的事件,設置css的onload事件 css.addEventListener("load", function() { console.log("link.onload"); }) // onreadystatechange爲監聽document的readyState屬性的事件 document.addEventListener("readystatechange", function() { // 在此處不會監聽到loading狀態 if (document.readyState == "loading") console.log(document.readyState); // interactive 爲DOM樹構建完成後觸發 if (document.readyState == "interactive") console.log(document.readyState); // complete爲渲染樹構建完成後觸發 if (document.readyState == "complete") console.log(document.readyState); }) // 一下爲監聽loading狀態 document.readyState == "loading" && console.log("loading") // 設置圖片的onload事件 img.addEventListener("load", function() { console.log("img.onload"); }); //==================詳細對比window.onload()與body.onload()===================== // body的onload事件實際就是window的onload事件 body.onload = function() { console.log("body.onload"); } window.addEventListener("load", function() { console.log("window.onload"); }); body.addEventListener("load", function() { console.log("body.onload"); }); // 對document對象設置監聽DOMContentLoaded方法 document.addEventListener("DOMContentLoaded", function(event) { console.log("document.DOMContentLoaded"); }); // 設置監聽beforeunload事件,爲用戶離開頁面時第一個觸發的事件 window.addEventListener("beforeunload事件", function(event) { console.log("window.beforeunload"); }); // 設置監聽pagehide事件,爲用戶離開頁面時第二個觸發的事件 window.addEventListener("pagehide", function(event) { console.log("window.pagehide"); console.log(event.persisted) }); // 設置監聽unload事件,爲用戶離開頁面時第三個觸發的事件 window.addEventListener("unload", function(event) { console.log("window.unload"); }); // 設置pageshow事件,爲用戶加載頁面時觸發的事件 window.addEventListener('pageshow', function(event) { console.log("pageshow"); console.log(event.persisted) }); </script> </body> </html>
這就夠了。html
<body>
<frame>
<frameset>
<iframe>
<img>
<link>
<script>
.onload()
方法說明:canvas
一、 window.onload() 爲在所有文檔加載完成後觸發,包括頁面的css、js和圖片資源加載完成 二、 img.onload() 方法爲在圖片加載完成後觸發,所以img.onload() 要優先於window.onload(),其次若是是從緩存中讀取到的圖片,則不會觸發該方法 三、 body.onload() 方法設置addEventListener監聽load事件無效,會與window.onload()方法衝突,同時聲明兩者,後聲明的會覆蓋前者, 其次是與window.addEventListener("load", function() {} )不會衝突,可是會影響執行順序,先定義先執行, 最後是個人一點觀點body.onload()實質就是window.onload()方法
readyState
改變時觸發document對象的readyState
一共有三個值瀏覽器
一、 loading 文檔正在加載 二、 interactive DOM樹構建完成,能夠訪問到DOM裏面的元素 三、 complete 渲染樹(Render Tree)構建完成 四、 MDN中關於readyState只有三種狀態(本人測試也是),但也有文章指出還有另外兩種狀態: 一、 uninitialized (未初始化) :對象還沒有初始化 二、 loaded (加載完畢) :對象加載數據完成, (若是有同窗知道爲何,請在下方評論好嗎?謝謝)
說明緩存
一、設置document.onreadystatechange事件,在此函數中沒有監聽到loading狀態 二、interactive 狀態爲DOM樹構建完成,在圖片加載完成前就會觸發此狀態,其次此狀態要比document對象的另一個事件DOMContentLoaded觸發稍早 三、complete 狀態爲Render Tree構建完成,在圖片以及樣式表文件加載完成前就會觸發此狀態
DOMContentLoaded
事件被觸發,而無需等待樣式表、圖像和子框架完成加載,即DOM樹構建完成。document.readyState=="interactive"
同樣,但在其以後觸發.beforeunload()
事件。Event
對象的returnValue
屬性賦值非空字符串,瀏覽器會彈出一個對話框,來詢問用戶是否肯定要離開當前頁面。沒有賦值時,該事件不作任何響應。unload
事件。說明:觸發此事件時,文檔會處於一種特殊的狀態框架
一、全部資源仍存在 (圖片, iframe 等.) 二、對於終端用戶全部資源均不可見 三、界面交互無效 (window.open, alert, confirm 等.) 四、錯誤不會中止卸載文檔的過程
pagehide
事件觸發後觸發bfcache
緩存.beforeunload()
事件觸發後觸發.unload()
事件,使得頁面確保被緩存,要考慮瀏覽器的兼容性,event
對象的persisted
屬性,能夠獲知頁面是否從bfcache
(FF和Opera提供的往返緩存)加載的.onload()
事件相似,可是.onpageshow()
在每次加載頁面時都會被觸發,而window.onload()
方法在緩存中加載頁面時將不會被觸發(火狐瀏覽器1.5版本)window.onload()
事件,使得頁面加載事件確保被觸發,要考慮瀏覽器的兼容性window.onload()
事件後觸發event
對象的persisted
屬性,能夠獲知頁面是否從bfcache
(FF和Opera提供的往返緩存)加載的一火狐的這篇文章提到了如何使用pagehide
與pageshow
方法,可是MDN中沒有關於pagehide
與pageshow
的詳細說明,因此你們僅做了解便可
二是在討論pagehide
與pageshow
方法時,與這篇文章的博主同樣, 我獲得的event.persisted
屬性始終爲false,不知是什麼緣由呢 ide
這篇文章僅是我的的一篇筆記,若是你發現本文存在不嚴謹的或者錯誤的地方請輕噴!謝謝。函數