我通常使用 jQuery,因为使用文档就绪功能很方便,这样我就可以等到 DOM 准备好后再将事件监听器附加到 DOM 元素。
我继承了一个项目,至少在一段时间内,该项目将使用大量内联事件调用:
<element onclick="doThis()">
不漂亮,但我必须处理它。
通常我会在 HTML 页面的底部加载 JS 文件。但是,如果我在这种情况下这样做,事件是否会等到文档准备好(主体加载)后再尝试执行,或者无论是否有大的 JS 文件,一旦单击元素就会触发 onclick 事件已经加载了吗?
我认为后者发生了,这意味着在这种情况下,我暂时无法将我的 JS 文件移出 HEAD。但还是想确认一下。
最佳答案
HTML 元素上的事件处理属性就像一个迷你脚本 block ,它的评估独立于页面上的其他脚本 block 。在 onclick=""的情况下,一旦元素被读入 DOM,事件处理程序属性就会被评估,并且如果元素被单击,事件处理程序属性将尝试运行。
顺便说一句,您可以将这些属性视为函数。属性定义的双引号之间的代码与函数定义的大括号之间的代码相同。
onclick="/* IN HERE */"
与
相同elem.onclick= function(){/* IN HERE */};
该函数是在浏览器评估时定义的,并在单击时执行。
如果 /* IN HERE */
区域中的代码有任何规定,并且在元素进入 DOM 时尚未加载到 DOM 中,则单击将会 导致错误。
正如我所说,所有脚本 block 和内联处理程序都是单独评估的。所以你的点击场景是一样的:
<!-- same as firing the click event -->
<script type="text/javascript">
doSomething();
</script>
<!-- externally loaded script file--late! -->
<script type="text/javascript" src="/path/to/provides_doSomething.js"></script>
关于JavaScript 内联事件监听器...它们是否等待 JS 加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5519940/