时间线也能够理解为记录浏览器加载页面一系列发生的过程。css
通常分为十个步骤:git
建立 Document 对象,开始解析 web 页面。解析 HTML 元素和他们的文本内容,后添加 Element 对象和 Text 节点到文档中。这个阶段 document.readyState ='loading'。github
遇到 link 外部 css,建立线程,进行异步加载,并继续解析文档。web
遇到 script 外部 js,而且没有设置 async、defer,浏览器同步加载,并阻塞,等待 js 加载完成并执行该脚本,而后继续解析文档。chrome
遇到 script 外部 js,若是是设置有 async、defer,浏览器建立线程异步加载,并继续解析文档。对于 async属性的脚本,脚本加载完成后当即执行。 (异步禁止使用document.write(),由于当你整个文档解析到差很少,再调用 document.write(),会把以前全部的文档流都清空,用它里面的文档代替)浏览器
遇到 img 等(带有 src),先正常解析 dom 结构,而后浏览器异步加载 src,并继续解析文档。网络
当文档解析完成(DomTree 创建完毕,不是加载完毕),此时document.readyState ='interactive'。dom
文档解析完成后,全部设置有 defer 的脚本会按照顺序执行。(注意与 async 的不一样,但一样禁止使用 document.write())异步
document 对象触发 DOMContentLoaded 事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段。async
当全部 async 的脚本加载完成并执行后、img 等加载完成后(页面全部的都执行加载完以后),document.readyState = 'complete',window 对象触发 load 事件。
今后,以异步响应方式处理用户输入、网络事件等。
更多文章请转移:github.com/wangyicong