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
2 つのボタン ハンドラが混同されていますか? 他のブラウザーでテストしましたが、Chrome、Firefox、IE10 はすべて同じ動作を示します。私はこれに少し困惑しています。MDN、QuirksMode.org、および仕様はすべて、さまざまなフェーズと、キャプチャ フェーズがバブリング フェーズに先行する方法を明確に説明しています。私の小さな実験の結果、Button bubble
ハンドラーが私の前に呼び出されるのはButton capture
なぜですか?
ここに何が起こっているのかのフィドルがあります:http://jsfiddle.net/Tr7G6/2
// Update ハンドラーをアタッチする順序が重要なようです。
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);
最初にキャプチャし、2 番目にバブルするようにバインドすると、クロスブラウザーで期待どおりの出力が生成されます。しかし、これはばかげています。この順序が重要なのはなぜですか?