最近对于文档加载方法有了新的理解,所以整理成一片简记,方便之后进行查阅。
先来一段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
这篇文章仅是我的的一篇笔记,若是你发现本文存在不严谨的或者错误的地方请轻喷!谢谢。函数