客户端JavaScript时间线
- 浏览器创建
Document 对象,并开始解析Web页面,解析 HTML 元素和它们的文本内容后添加 Element 对象和 Text 节点套文档中。这个阶段 document.readyState 属性的值是 "loading"。
- 当
HTML 解释器遇到了没有 async 和 defer 属性的 <script> 元素时,他把这些元素添加到文档中,并且同步执行。在脚本下载(如果需要)和执行时解释器会暂停。这样脚本就可以用 document.write() 来把文本插入到输入流中。
- 当遇到
async 属性(如果 <script> 标签同时有 async 和 defer 属性,会遵从 async 并忽略 defer)的 <script> 元素时,它开始下载脚本文本,并继续解析文档。脚本会在它下载完成后尽快执行。禁止使用 document.write() 方法。
- 当文档完成解析,
document.readyState 属性变成 "interactive"。
- 所有带有
defer 属性的脚本,会按它们在文档里出现的顺序执行。异步脚本可能也会在这个时间执行。延迟脚本能访问完整的文档树,禁止使用 document.write() 方法。
- 浏览器在
Document 对象上触发 DOMContentLoaded 事件。这标志着 程序执行从同步脚本执行阶段转换到了异步事件驱动阶段 但是,这时可能还有异步脚本没有执行完成。
- 这时,文档已经完成解析完成,但是浏览器可能还在等待其他内容载入,如图片。当所有这些内容完全载入时,并且所有异步脚本完全载入和执行,
document.readyState 属性改变为 complete ,Web浏览器触发 window 对象上的 load 事件。
- 从此刻起,会调用异步事件,以异步响应用户输入事件,网络事件,计时器过期等。
文档加载事件
| 事件名称 |
描述 |
readystatechange |
文档还在加载:loading, 文档解析完成:interactive, 文档完全加载完成:complete |
DOMContentLoaded |
程序执行从同步脚本执行阶段转换到了异步事件驱动阶段 |
load |
所有内容完全载入,所有异步脚本完全载入和执行 |
1 2 3 4 5 6 7 8 9 10 11
| document.addEventListener('DOMContentLoaded', function(){ console.log('DOMContentLoaded') }, false)
window.addEventListener('load', function(){ console.log('load') }, false)
document.onreadystatechange = function(){ console.log(document.readyState) }
|
运行结果:
1 2 3 4
| interactive DOMContentLoaded complete load
|