document.readyState
只读属性,返回document的加载状态。有三个可能的值
- loading 仍在加载
- interactive 文档加载完成,解析完成,但图片、样式表等外部资源可能仍在加载。DOMContentLoaded即将发生
- complete 文档与所有子资源都完成加载。load事件即将触发
加载顺序
document.readystate = 'loading'
document.readystate变成interactive
DOMContentLoaded事件触发
document.readystate变成complete
load事件触发
可通过readystatechange事件监听document加载状态
document.addEventListener('readystatechange', () => console.log(document.readyState));
带async的脚本在加载完后会立即执行,如果想要保证它在DOMContentLoaded之后执行,可能最开始会想到在脚本中用这种写法:
document.addEventListener('DOMContentLoaded', () => { //代码主体 })
但是异步脚本也可能会在DOMContentLoaded事件结束后也就是readystate为complete阶段才下载完,此时添加的DOMContentLoaded事件已经不会触发,所以此脚本将不再执行。
readystate可以用于解决这种问题,代码如下
if (document.readyState != 'loading') { //代码主体 } else { window.addEventListener("DOMContentLoaded", function () { //代码主体 }); }