2014-04-13 50 views
10

我很困惑與下面的腳本:爲什麼用dispatchEvent觸發定義的事件不遵守事件的冒泡行爲?

var event = new Event('shazam'); 

document.body.addEventListener('shazam',function(){ 
    alert('body'); 
}); 

document.addEventListener('shazam',function(){ 
    alert('document'); 
}); 

window.addEventListener('shazam',function(){ 
    alert('window'); 
}); 

document.body.dispatchEvent(event); 

當我運行在我的瀏覽器這個劇本,我剛剛得到的警報(「主體」);事件。 但是,如果我將addEventListener(第三個可選參數)的捕獲參數設置爲true,則應按順序捕獲所有警報。

爲什麼shazam事件不起泡?

+1

創建'CustomEvent'代替'Event'並把它傳遞TRUE;作爲第二個參數(canBubble參數) –

+0

的財產似乎不稱爲'canBubble',它是'泡沫'。 – Shnd

回答

20

您需要將氣泡屬性設置爲true,你必須建設

var event = new Event('shazam',{bubbles:true}); 

或initEvent老辦法中做到這一點,傳遞true作爲第二個參數,讓泡沫

event.initEvent("shazam",true); 

MDN Doc

+0

謝謝您的簡要回復:) – Shnd

+0

但有一個問題: 爲什麼在事件對象中默認禁用冒泡。 – Shnd

+1

根據https://dom.spec.whatwg.org/#interface-event它默認爲false(或者,如果您願意,請https://developer.mozilla.org/en-US/docs/Web/API/事件/事件)。我猜想這是默認情況下提供的潛在副作用最小的選項。 –