我试图理解useCapture
JavaScript 中的参数addEventListener()
。这是我的 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
?
这是正在发生的事情的小提琴: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);
绑定到第一个捕获和第二个气泡确实会产生我预期的跨浏览器输出。但这是愚蠢的。为什么这个顺序很重要?