DOMContentLoaded上的document.readyState?

时间:2012-11-12 15:41:36

标签: javascript dom javascript-events cross-browser

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

  

DOMContentLoaded触发时,我可以假设document.readyState的值始终为"complete""interactive" / "loaded"吗?

     

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

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

您可能想知道:为什么不只听readystatechange?这是因为Android 2.3.5标准浏览器是目标平台,并且它没有实现readystatechange事件。

3 个答案:

答案 0 :(得分:8)

readyState触发时,"interactive"属性的值始终为DOMContentLoaded。 MDN documentation声称:

这一事实证明了这一点
// alternative to DOMContentLoaded event
document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}

可与DOMContentLoaded处理程序互换。您还可以查看规范here,重申这一点。

答案 1 :(得分:2)

根据接受的答案:

1-test-test@gmail.com 触发后,readyState属性的值始终为"interactive"

错误

它具有以下任一特征:

  • DOMContentLoaded
  • interactive

文档。 readyState ref.

在加载文档时返回complete,在完成解析但仍在加载子资源时返回"loading",在文档加载后返回"interactive"

如果将事件监听器附加到"complete" 之前 ,文档的状态为readystatechange,则可以单独检查interactive,例如以MDN为例。这样一来,只要有人到达状态,就会抓住它。

但是如果以后再检查状态,则不会。

例如,来自MDN的这些都相等:

interactive

这并不意味着:

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


document.addEventListener("DOMContentLoaded", function () {
    initApplication();
});

答案提示。

可以说:

  • if (document.readyState !== 'loading') assert(document.readyState === 'interactive')

永远不会等于:

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

答案 2 :(得分:0)

触发readyState时,"interactive"属性的值至少为DOMContentLoaded。正如@MTCoster指出here一样,该事件将推迟到具有defer属性的链接脚本和module链接或内联脚本执行后再进行。另请参见this post