【发布时间】:2017-01-05 18:09:18
【问题描述】:
我为表单提交设置了两个侦听器。一个是在onsubmit 属性中指定的,另一个是使用event listener 指定的。
根据我的测试,属性中指定的总是首先触发。总是这样吗?事件属性会总是先触发吗?或者有没有这种情况不会发生的情况?
function attribute(e) {
console.log('Attribute');
e.preventDefault();
}
function listener(e) {
console.log('Listener');
e.preventDefault();
}
document.querySelector('form').addEventListener('submit', listener);
<form onsubmit="attribute(event)">
<button type="submit">Submit</button>
</form>
我知道using event attributes should be "avoided",这更像是一个理解问题。
【问题讨论】:
-
我不会依赖它。而是使用
addEventListener添加所有侦听器,它们(相同类型的事件)保证按定义的顺序触发。 -
是的,我同意你的看法。甚至出现这个问题的原因是因为我有一个第 3 方表单验证插件,只要 JS 可用于供应商捆绑包中的页面,它就会始终附加。我无法改变它的位置。由于应用程序架构,我的 JS 代码是在供应商捆绑包之后加载的。因此,验证器 JS 总是在我的代码之前触发 :( 。虽然我不会走添加事件属性的路线,但我仍然很好奇这是否总是如此。
-
onclick在.addEventListener("click")之前被调用。无法在规范中找到预期结果的详细信息,但似乎优先于元素处的style属性 -
@KevBot 见Default action "
<A HREF="somewhere.html" onClick="doSomething()">在点击链接的情况下,必须先执行事件处理程序。毕竟,当默认动作发生时——new页面已加载——旧页面(包括事件处理程序)已从浏览器内存中删除。因此,如果要执行 onclick 事件处理程序,则必须在默认操作之前完成。” -
The specs 说:“同步事件(“同步事件”)被视为在先进先出模型中的虚拟队列中”。在附加事件之前,元素必须存在。这意味着,在 JS 可以创建其事件之前,属性事件已被推送到队列中。如果第三方脚本使用事件委托,事情会变得更加复杂。您可以尝试删除第三方侦听器,并在附加自己的侦听器后重新附加它(当然,如果您可以获得对第三方处理函数的引用)。
标签: javascript html attributes event-handling dom-events