Javascript: 将 eventListener 设置为 DOM 没有 window.onload 的对象?

Javascript: Set eventListener to DOM object without window.onload?

我的 index.html 包含两个 javascript 代码,分别是 plugin.jsmain.js(插件后主要包含),
我想把 plugin.js 作为一个可重复使用的插件,比如检查 index.html 文件是否有任何具有 click-me class 属性的元素,如果 index.html 有这种的元素,然后为每个此类元素设置一个 eventListener。

我希望我的 window.onload 函数始终在 main.js 而不是 plugin.js 中,但在这种情况下我无法通过 className 获取 DOM 对象在 plugin.js 中,我也不想在 main.js 中调用 plugin.js 的任何函数。

有人知道吗?

您可以只在正文之后包含脚本。

<body>
</body>
<!-- add your scripts here -->

那么你就不需要再检查文档是否准备好了,这样的缺点是只有在页面完全呈现后才开始下载。

另一种可能性是使用 defer

<script type="text/javascript" src="plugin.js" defer></script>
<script type="text/javascript" src="main.js" defer></script>

这种方式会尽快下载脚本,但只会在页面准备好后按顺序执行。

更详细的回答here

为什么不直接检查被点击的元素是否有来自根的 click-me class?它使您只在主体上声明一个侦听器。

function listener(event) {
    if(event.target.classList.contains("click-me")) {
        // Do something
    }
}
document.body.addEventListener("click", listener, true);

嗯,你应该正确使用 onload 作为事件侦听器:

window.addEventListener("load", function() {

});

main.jsplugin.js 中都可以根据需要添加任意多次。

此外,最好使用 DOMContentLoaded 事件,因为它不会等待加载图像。这真的很重要,如果您依赖 window.onload,那么在访问的前 10 秒内,仅一张待定图像就会使您的页面变得毫无用处。它是这样使用的:

  document.addEventListener("DOMContentLoaded", function(event) {
    console.log("DOM fully loaded and parsed");
  });

但是它有兼容性问题,所以我建议使用一些库。

哦,还有最后一件事 - 除非需要,否则不要 link 在正文之前编写脚本。它们会阻止页面解析。