在没有子节点的 html 元素上,事件捕获阶段未按预期工作
Event capturing phase is not working as expected on html element which don't have children nodes
让我们考虑以下html
<div id='outer'>
Outer Tag
<div id='inner'>Inner Tag</div>
</div>
应用事件
var outer = document.getElementById('outer'),
inner = document.getElementById('inner');
outer.addEventListener('click',function(){
console.log('Outer Clicked!')
}, false);
outer.addEventListener('click',function(){
console.log('Outer Captured!')
}, true); // event capture flag set to true
inner.addEventListener('click',function(){
console.log('Inner Clicked!')
}, false);
所以现在,我们已经应用了事件,正如预期的那样,当我们点击 inner element
时,输出应该如下所示
Outer Captured!
Inner Clicked!
Outer Clicked!
但是如果我们从上面移除 inner span
html 那么捕获阶段似乎是在冒泡阶段之后触发的,如下所示
Outer Clicked!
Outer Captured!
谁能解释为什么会这样?
在目标元素上,冒泡和捕获之间没有区别 - 事件在 target phase 中。在其上注册的所有事件处理程序都将被触发,并且它们将按照它们安装的顺序被触发。
让我们考虑以下html
<div id='outer'>
Outer Tag
<div id='inner'>Inner Tag</div>
</div>
应用事件
var outer = document.getElementById('outer'),
inner = document.getElementById('inner');
outer.addEventListener('click',function(){
console.log('Outer Clicked!')
}, false);
outer.addEventListener('click',function(){
console.log('Outer Captured!')
}, true); // event capture flag set to true
inner.addEventListener('click',function(){
console.log('Inner Clicked!')
}, false);
所以现在,我们已经应用了事件,正如预期的那样,当我们点击 inner element
时,输出应该如下所示
Outer Captured!
Inner Clicked!
Outer Clicked!
但是如果我们从上面移除 inner span
html 那么捕获阶段似乎是在冒泡阶段之后触发的,如下所示
Outer Clicked!
Outer Captured!
谁能解释为什么会这样?
在目标元素上,冒泡和捕获之间没有区别 - 事件在 target phase 中。在其上注册的所有事件处理程序都将被触发,并且它们将按照它们安装的顺序被触发。