You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DOMContentLoaded事件不触发,模块脚本中仅外部代码运行求助

问题:DOMContentLoaded事件监听无输出的原因及解决办法

我编写了如下代码,但DOMContentLoaded事件内的代码完全没有生效,仅第一行console.log("Script loaded")能打印:

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>JavaScript  </title>

    <meta charset="UTF-8" />
  </head>

  <body>
    <div class="App"></div>

    <script src="./index.mjs" type="module"></script>
  </body>
</html>

index.mjs

console.log("Script loaded");   //仅该行能打印

document.addEventListener("DOMContentLoaded", () => {
  console.log("DOM fully loaded and parsed");  //事件内无输出
});

原因及解决方案
  • 原因:带有type="module"的脚本属于ES模块脚本,浏览器对这类脚本的默认处理是延迟执行——会等到整个DOM树解析完成后才运行脚本。当你的模块脚本执行时,DOMContentLoaded事件早已经触发过了,所以后续添加的监听函数不会被调用。

  • 解决方案1:直接移除事件监听
    既然模块脚本本身会等待DOM解析完成再执行,直接把需要在DOM就绪后运行的代码写在模块里即可,不需要额外监听事件:

    console.log("Script loaded");
    // 直接执行DOM就绪后需要运行的代码
    console.log("DOM fully loaded and parsed");
    
  • 解决方案2:兼容处理(保留事件监听)
    如果一定要保留事件监听的写法,可以先判断当前DOM的加载状态,如果已经加载完成就直接执行回调,否则再监听事件:

    console.log("Script loaded");
    
    function handleDomReady() {
      console.log("DOM fully loaded and parsed");
    }
    
    // 判断DOM是否还在加载中
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", handleDomReady);
    } else {
      // DOM已经加载完成,直接执行回调
      handleDomReady();
    }
    

内容的提问来源于stack exchange,提问作者Ekas Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:27:08