我有一个脚本DOMContentLoaded
事件处理程序—
document.addEventListener('DOMContentLoaded', function() {
console.log('Hi');
});
我正在异步加载 -
<script async src=script.js></script>
然而,事件处理程序从未被调用过。如果我同步加载它——
<script src=script.js></script>
效果很好。
(即使我改变了DOMContentLoaded
事件到load
事件,它从未被调用。)
是什么赋予了?无论浏览器如何加载脚本,都应该注册事件处理程序,不是吗?
Edit:它不适用于 Chrome 18.0.1025.11 beta,但是,DOMContentLoaded
, it does在 Firefox 11 beta 上(但带有load
事实并非如此)。去搞清楚。
哦,JavaScript 和 DOM 的伟大领主,请告诉我我的方法中的错误!
通过异步加载脚本,您可以告诉浏览器它可以独立于页面的其他部分加载该脚本。这意味着页面可能会完成加载并可能会触发DOMContentLoaded
在加载脚本之前以及在注册事件之前。如果发生这种情况,您将错过该活动(当您注册时已经发生了)。
在所有现代浏览器中,您可以测试文档以查看它是否已加载(MDN doc https://developer.mozilla.org/en/DOM/document.readyState),您可以检查:
if (document.readyState !== "loading")
查看文档是否已加载。如果是的话,就做你的事吧。如果不是,请安装事件侦听器。
事实上,作为参考源和实现思想,jQuery 做了同样的事情,它的.ready()
方法,它看起来得到了广泛的支持。 jQuery 有这段代码,当.ready()
调用它首先检查文档是否已经加载。如果是这样,它会立即调用ready函数,而不是绑定事件监听器:
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
return setTimeout( jQuery.ready, 1 );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)