我試圖理解JavaScript的addEventListener()
中的useCapture
參數。這裏是我的HTML:addEventListener中的useCapture表現奇怪
<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);
綁定捕獲第一和泡沫第二確實產生我期望的,跨瀏覽器的輸出。但這很愚蠢。爲什麼這個命令很重要?
好奇的是,他們只是忽略了任何優先順序,只是因爲「它總是在同一個元素上」。我無法在規範中找到文本文本,但是在給出您的解釋以及在此行爲之後的跨瀏覽器實現後,它必須是真實的!謝謝 :) –