JS 完美收官之——js 加载时间线
什么是 js 加载时间线?浏览器在开始运行一个页面的时候,首先它会初始化 js 功能,当 js 发挥它的功能时候,记录了一系列浏览器按照顺序做的事情,也就是一个执行顺序,谁在谁之前发生,谁在谁之后发生。
js 时间线主要步骤:[创建 document 对象开始——>文档解析完——>文档加载完并执行完]
1、创建 Document 对象,开始解析 web 页面。这个阶段 document.readyState = 'loading'.
代码验证:
执行结果:
2、遇到 link 外部 css,创建线程,进行异步加载,并继续解析文档。
3、遇到 script 外部 js,并且没有设置 async、defer,浏览器同步加载,并阻塞,等待 js 加载完成并执行该脚本,然后继续解析文档。
4、遇到 script 外部 js,并且设置有 async、defer,浏览器创建线程异步加载,并继续解析文档。(异步禁止使用 document.write())
代码验证:
执行结果:
在 window.onload 后再次验证:
执行结果:
5、遇到 img 等(带有 src),先正常解析 dom 结构,然后浏览器异步加载 src,并继续解析文档。看到标签直接生产 dom 树,不用等着 img 加载完 src。
6、当文档解析完成(domTree 建立完毕,不是加载完毕,解析在加载之前),document.readyState = 'interactive'。
代码验证:
执行结果:
7、文档解析完成后,所有设置有 defer 的脚本会按照顺序执行。(注意与 async 的不同,但同样禁止使用 document.write());
8、文档解析完成后,document 对象触发 DOMContentLoaded 事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段。
代码验证:
执行结果:
在 jquery 中有一个 $(document).ready(function(){ })方法 ,这个方法就是当 dom 解析完就执行的部分。
这个 ready 方法经常会在面试中问到,ready 和 window.onload 的区别?
区别就是 ready 方法快,window.onload 慢,因为 ready 是 dom 解析完就执行,而 window.onload 则是加载完再执行。ready 方法的底层原理就是依据 document.readyState 变成 interactive 和 DOMContentLoaded 事件
9、当所有 async 的脚本加载完成并执行后、img 等加载完成后(页面所有的都执行加载完之后),document.readyState = 'complete',window 对象触发 load 事件。
10、从此,以异步响应方式处理用户输入、网络事件等。
版权声明: 本文为 InfoQ 作者【法医】的原创文章。
原文链接:【http://xie.infoq.cn/article/2dde36abd7d678a32486c23fc】。文章转载请联系作者。
评论