【发布时间】:2013-08-07 12:28:31
【问题描述】:
我试图理解 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 都显示相同的行为。我对此有点困惑。 The MDN、QuirksMode.org 和 the spec 都清楚地描述了不同的阶段以及捕获阶段如何先于冒泡阶段。为什么我的小实验导致 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);
绑定到第一个捕获和第二个气泡确实会产生我预期的输出,跨浏览器。但这是愚蠢的。为什么这个顺序很重要?
【问题讨论】:
标签: javascript dom-events addeventlistener