document.readystate 的取值有 uninitialized、loading、interactive、complete、loaded 五种,现代标准稳定可用的仅 loading、interactive、complete;它用于在 dom 可交互但资源未全加载时介入,比 onload 和 domcontentloaded 更底层可控。

document.readyState 的取值有哪些
它不是布尔值,也不是百分比,而是一个只读字符串,浏览器根据当前文档生命周期返回以下五个值之一:uninitialized(极少见,仅旧IE)、loading、interactive、complete,部分规范还提过 loaded(已基本弃用)。现代标准中,实际能稳定观测到的只有 loading、interactive、complete 三种。
什么时候该监听 readyState 而不是用 onload 或 DOMContentLoaded
当你需要在 interactive 阶段就介入(比如页面刚可交互但图片/脚本还在加载),或需兼容老环境(如 IE8–10)时,document.readyState 比事件更底层、更可控。但要注意:
-
onload等待所有资源(图片、iframe、CSS)加载完毕,DOMContentLoaded只等 DOM 解析完成,而readyState === 'interactive'表示 DOM 已构建完、JS 可执行、用户可交互——但它不保证 CSS 已解析完毕,可能样式未生效 - 在
interactive阶段操作 DOM 是安全的,但若依赖getComputedStyle或布局计算,仍可能拿到未应用样式的值 - 不要在
loading阶段尝试访问document.body,它大概率是null
如何可靠监听 readyState 变化
直接轮询或一次性判断都容易漏掉状态,推荐用 readystatechange 事件 + 状态兜底:
document.addEventListener('readystatechange', () => {
if (document.readyState === 'interactive') {
console.log('DOM ready, user can interact');
} else if (document.readyState === 'complete') {
console.log('All resources loaded');
}
});
// 兜底:防止事件没触发(如脚本动态插入后才监听)
if (document.readyState === 'complete') {
// 立即执行
} else if (document.readyState === 'interactive') {
// 立即执行(某些浏览器会跳过 interactive)
}
注意:readystatechange 在 complete 前一定会触发 interactive,但某些场景(如内联脚本紧贴
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











