如何检测是否触发了DOMContentLoaded

bru*_*ais 45 javascript events readystate

我正在尝试帮助开发一个库,为此我正在尝试使用页面加载.
在这个过程中,我想让库完全兼容defer和async的使用.

我想要的很简单:
我怎么知道DOMContentLoaded在文件执行时被触发了?

为什么这么难?
在IE中,document.readyState在DOMContentLoaded之前显示交互.
不会以任何方式使用浏览器检测,这违反了我和其他参与者的政策.

什么是正确的选择?

编辑:

好像我还不够清楚.我没有兴趣知道是否已经发生加载事件!我已经知道如何解决这个问题!我想知道如何用DOMContentLoaded解决!!!

jfr*_*d00 50

要查看是否已加载页面中的所有资源:

if (document.readyState === "complete" || document.readyState === "loaded") {
     // document is already ready to go
}
Run Code Online (Sandbox Code Playgroud)

这已经在IE和webkit中得到了很长时间的支持.它在3.6中被添加到Firefox中.这是规格. "loaded"适用于较旧的Safari浏览器.

如果您想知道页面何时被加载和解析,但尚未加载所有子资源(更类似于DOMContentLoaded),您可以添加"交互"值:

if (document.readyState === "complete" 
     || document.readyState === "loaded" 
     || document.readyState === "interactive") {
     // document has at least been parsed
}
Run Code Online (Sandbox Code Playgroud)

除此之外,如果你真的只想知道DOMContentLoaded何时被触发,那么你必须为它安装一个事件处理程序(在它触发之前)并在它触发时设置一个标志.

这个MDN文档也是一个非常好的阅读,有关DOM状态的更多信息.

  • 你不是在回答这个问题。我想了解 DOMContentLoaded 事件,而不是 load 事件。load 事件很简单,DOMContentLoaded 我不知道。 (3认同)
  • 第一个代码片段不正确 - `document.readyState == "interactive"` 也可以表明 DOMContentLoaded 被触发。请参阅此处:https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState (3认同)
  • @brunoais - 然后为 DOMContentLoaded 事件安装一个处理程序,并在触发时设置一个标志。我不认为还有其他选择。 (2认同)

ori*_*dam 13

document.readyState此事件被触发而改变.因此,您可以检查readyState值,这样就可以判断事件是否被触发.这是start()在文档准备就绪时运行的代码:

if (/comp|inter|loaded/.test(document.readyState)){
    // In case DOMContentLoaded was already fired, the document readyState will be one of "complete" or "interactive" or (nonstandard) "loaded".
    // The regexp above looks for all three states. A more readable regexp would be /complete|interactive|loaded/
    start();
}else{
    // In case DOMContentLoaded was not yet fired, use it to run the "start" function when document is read for it.
    document.addEventListener('DOMContentLoaded', start, false);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的。`DOMContentLoaded` 仅在 *`interactive` 之后被触发(此处证明:https://jsfiddle.net/luciopaiva/grs82byv/20/) (2认同)

Luc*_*iva 6

如何在 DOMContentLoaded(或尽快)上正确运行某些东西

如果您需要等待 HTML 文档完全加载并解析以运行某些内容,那么您需要等待DOMContentLoaded,毫无疑问。但是,如果您无法控制脚本何时执行,则可能DOMContentLoaded在您有机会侦听事件时已被触发。

考虑到这一点,您的代码需要检查是否DOMContentLoaded已经被触发,如果是,则立即执行需要等待的任何内容DOMContentLoaded

function runWhenPageIsFullyParsed() {
    // your logic goes here
}

if (document.readyState === "complete") {
    // already fired, so run logic right away
    runWhenPageIsFullyParsed();
} else {
    // not fired yet, so let's listen for the event
    window.addEventListener("DOMContentLoaded", runWhenPageIsFullyParsed);
}
Run Code Online (Sandbox Code Playgroud)

页面加载期间事件的正确顺序是:

  • document.readyState 更改为 interactive
  • windowDOMContentLoaded事件被解雇
  • document.readyState 更改为 complete
  • windowload事件被解雇load

您可以在此小提琴中检查页面加载期间事件的完整顺序。

  • 在小提琴中的 JS 开头添加 `log(document.readyState);` 有助于指出在交互之前发生的 document.readyState 的 `loading` 状态。我会将这一重要步骤添加到事件的顺序中。这篇 [MDN readyState](https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState) 文章对此进行了概述。谢谢! (2认同)