You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WHATWG规范中event listener的invoke为何会两次调用inner invoke?

事件调用机制中两次inner invoke的场景与意义

触发两次inner invoke的场景

只有同时满足以下两个条件时,才会触发第二次inner invoke:

  • 第一次调用inner invoke后返回的found值为false——意味着当前事件目标在对应阶段(捕获/冒泡)没有注册任何匹配的显式事件监听器;
  • 事件的isTrusted属性为true——即事件由浏览器原生行为触发(如用户点击、页面加载、表单提交等),而非通过JavaScript手动调用dispatchEvent触发的合成事件。

两次调用的意义

这一逻辑是为了兼容早期浏览器的遗留行为。在旧版浏览器(如IE)中,即使目标元素没有显式注册对应阶段的事件监听器,浏览器仍会执行该事件的内置默认处理逻辑。

WHATWG规范通过两次inner invoke的设计来模拟这种行为:

  • 第一次调用:遍历执行开发者显式注册的事件监听器,若找到匹配的监听器则found为true,结束流程;
  • 第二次调用:当第一次未找到显式监听器且事件为可信事件时,触发浏览器内置的默认事件处理逻辑(比如<a>标签的跳转、<form>的提交、输入框的默认输入行为等,这些底层逻辑本质上被视为浏览器内置的“隐式”事件监听器)。

对应规范片段

  1. 令found为执行inner invoke(传入event、listeners、phase、invocationTargetInShadowTree,若有则传入legacyOutputDidListenersThrowFlag)的结果。
  2. 若found为false且event的isTrusted属性为true,则:
    1. 执行inner invoke(传入event、listeners、phase、invocationTargetInShadowTree,若有则传入legacyOutputDidListenersThrowFlag)。

内容的提问来源于stack exchange,提问作者MaximPro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:27:24