Javascript 已调度事件从捕获/气泡周期的哪个阶段开始?
假设我有这个布局Javascript 已调度事件从捕获/气泡周期的哪个阶段开始?,javascript,dom,browser,Javascript,Dom,Browser,假设我有这个布局 <body> <div class="A"> <span class="B">span</span> </div> <body> 我将捕获事件侦听器分配给: div_class_A_element.addEventListener('custom',function(){ console.log('captured custom on A'); }, true); 当我点击B时会
<body>
<div class="A">
<span class="B">span</span>
</div>
<body>
我将捕获事件侦听器分配给:
div_class_A_element.addEventListener('custom',function(){
console.log('captured custom on A');
}, true);
当我点击B时会发生什么?我需要一场接一场的比赛。另外,请不要告诉我只做jsfiddle,我知道我可以做到,但我想知道的是规范中说它应该做什么
以下是我的猜测:
一旦单击事件从文档一直向下移动到B,文档的委托处理程序就会在B上运行,然后一直返回到文档。现在发生了什么我不知道:它在B上调度自定义事件:自定义事件是否从B开始并开始冒泡?如果是这样,则A的捕获处理程序将不会运行(因为捕获处理程序在冒泡阶段不会捕获)。或者,调度的事件是否会像其他事件一样运行,并从文档开始执行整个捕获阶段 调度的事件也要经过捕获阶段。根据w3c dom级别3规范: 应用程序可以使用 EventTarget.dispatchEvent()方法,并且实现必须分派 事件对象,就像通过此方法一样。 - 这句话本身没有多大帮助,但规范继续解释了
dispatchEvent
(和内部实现)必须遵循的事件流:
stopperPagation()
停止)。可以通过将事件设置为false来跳过冒泡。冒泡
从树顶部到事件目标的EventTargets链
目标在事件初始分派之前确定。如果
在事件处理和事件流期间对树进行修改
将根据树的初始状态继续。
-
因此,在您的示例中,当您从B调度事件时,将调用A上的自定义事件处理程序
从MDN(在dispatchEvent
上):
将事件分派到事件系统中。该事件受
与直接调度的事件具有相同的捕获和冒泡行为。
-
如果场景中的每个元素都有事件,则会显示操作顺序
.B点击
.点击
身体咔哒声
文档侦听器
在地图上捕捉到了风俗
窗口点击
文档
侦听器确实会立即触发A
div调度,然后冒泡继续(到窗口
)哦,亲爱的。新的JSFIDLE字体比以前可读性差得多。感谢你的这把小提琴!我喜欢你指出的调度事件
调用在原始事件冒泡之前完成。
div_class_A_element.addEventListener('custom',function(){
console.log('captured custom on A');
}, true);