DOMContentLoaded上的document.readyState?

fek*_*lee 7 javascript dom cross-browser dom-events

在支持事件DOMContentLoaded和属性的浏览器中document.readyState:

DOMContentLoaded火灾,我可以假设的价值document.readyState永远是两种"complete""interactive"/ "loaded"

(或者可能document.readyState有时仍然有价值"loading"?)

在您的回答中,请提供权威来源的参考.

你可能想知道:为什么不听readystatechange呢?这是因为Android 2.3.5标准浏览器是一个目标平台,并没有实现该readystatechange事件.

Asa*_*din 8

readyState属性的值始终"interactive"DOMContentLoaded触发时.MDN 文档证明了这一点声称:

// alternative to DOMContentLoaded event
document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}
Run Code Online (Sandbox Code Playgroud)

可以与DOMContentLoaded处理程序互换.你也可以看看这里的规范,重申这一点.

  • @feklee我很好奇;就您的问题而言,这个答案并不完全准确。你为什么接受它?更重要的是,你是如何解决这个问题的?谢谢 (3认同)
  • 我很欣赏这是一个非常古老的答案,但是有一个细微的差异确实让我感到惊讶。`readyState` 设置为 `interactive` *before* 具有 `defer` 属性的脚本被评估,而 `DOMContentLoaded` 被触发 *after*。 (3认同)
  • 不幸的是,这在Android 2.3.5上并不正确.我刚做了一个测试,结果对我来说完全出乎意料:当`DOMContentLoaded`触发时,`document.readyState`的值是``loaded``(即既不是'"完成"`也不是''交互式" `,也不是"加载"`). (2认同)
  • @MTCoster 我正在使用脚本自动化浏览器,这个评论对于弄清楚readyState Interactive 和 webnavigation.onDomContentLoaded 之间的区别确实很有帮助。谢谢你! (2认同)

小智 5

根据接受的答案:

readyState属性的值总是"interactive"DOMContentLoaded触发时。

错误的

它具有以下任一项:

  • interactive
  • complete

文档 。准备状态 参考。

"loading"在文档加载时返回,"interactive"一旦完成解析但仍在加载子资源,以及"complete"一旦加载。

如果readystatechange Document 具有状态之前附加一个事件侦听器,则interactive可以interactive单独检查,例如来自 MDN 的示例。然后,如果它到达它,就会捕获该状态。

但是,如果在稍后阶段检查状态,则不会。

同样来自 MDN 的例子,这些是相等的:

document.onreadystatechange = function () {
  if (document.readyState === 'interactive') {
    initApplication();
  }
}


document.addEventListener("DOMContentLoaded", function () {
    initApplication();
});
Run Code Online (Sandbox Code Playgroud)

这并不意味着:

if (document.readyState !== 'loading')
    assert(document.readyState === 'interactive')
Run Code Online (Sandbox Code Playgroud)

答案表明。

至于说:

  • document.addEventListener("DOMContentLoaded", ...

永远不会等于:

  • window.addEventListener('load', ...