我正在尝试理解JavaScript中addEventListener()
的useCapture
参数。这是我的HTML代码:
<div id="wrapper">
<button id="button">Click me</button>
</div>
这是我的JavaScript代码:
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper capture'); }, true);
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button capture'); }, true);
现在,我预期的顺序应该是
Wrapper capture, Button capture, Button bubble, Button bubble
。令人惊讶的是,这是我的输出结果:Wrapper capture
Button bubble
Button capture
Wrapper bubble
两个按钮处理程序混淆了吗?我在其他浏览器中进行了测试,但Chrome,Firefox和IE10都显示相同的行为。这让我感到困惑。MDN, QuirksMode.org和规范都清楚地描述了不同阶段以及捕获阶段在冒泡阶段之前的方式。为什么我的小实验结果会导致
Button bubble
处理程序在 Button capture
之前被调用?这是一个演示发生情况的Fiddle:http://jsfiddle.net/Tr7G6/2
// 更新 似乎附加处理程序的顺序很重要。
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper capture'); }, true);
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button capture'); }, true);
document.getElementById('button').addEventListener('click', function () { console.log('Button bubble'); }, false);
绑定事件时先捕获再冒泡能够产生我所期望的跨浏览器输出,但这很愚蠢。为什么顺序很重要?