JavaScript 内联事件监听器...它们是否等待 JS 加载?

标签 javascript load

我通常使用 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/

相关文章:

javascript - 跳过从数据库到 html 的 AJAX 值

javascript - 跨源请求被阻止 : Occur even after CORS enabled on my API ;

ajax - jquery .get 在渲染之前完全下载内容

android - 如何在soundPool(Android)中逐渐加载声音?

jquery加载方法

javascript - 如何将 JavaScript 中的本地存储值转换为服务器存储值?

javascript - AngularJS ng-click 转到另一个页面(使用 Ionic 框架)

javascript - 通过 html datalist 和 *ngFor 显示一个值并提交另一个值

javascript - jQuery .load() 不加载插件

javascript - 具有多个 URL 的 jQuery AJAX