小歷史:
事件傳播的不同還要從早先的兩家瀏覽器巨頭說起,網(wǎng)景和IE為了能爭奪市場瘤载,互相使用相反的技術(shù)否灾,當(dāng)網(wǎng)景使用事件捕獲流的時候,IE則使用事件冒泡流鸣奔。后來W3C為了能規(guī)范規(guī)定墨技,直接折中惩阶,當(dāng)事件發(fā)生時,先發(fā)生向下傳播健提,當(dāng)?shù)降琢艘院笤俅问褂檬录芭萘彰ǎ饾u的冒泡到根節(jié)點伟叛。
事件傳播分三個階段:
DOM事件流(event flow )存在三個階段:事件捕獲階段私痹、處于目標(biāo)階段、事件冒泡階段统刮。
- 在事件捕獲階段紊遵,事件從document對象沿著文檔樹向下傳播給目標(biāo)節(jié)點。如果目標(biāo)的任何一個祖先注冊了捕捉事件句柄侥蒙,那么在事件傳播的過程中暗膜,就會運(yùn)行這些句柄(IE10及以下不支持捕獲型事件)。
- 目標(biāo)階段發(fā)生在目標(biāo)節(jié)點自身鞭衩,這與0級事件模型提供的事件處理方法類似学搜。
-
事件冒泡階段,在這個階段论衍,事件將從目標(biāo)元素向上傳播回(像冒泡)Document對象的文檔層次(IE8 及以下沒有捕獲階段)瑞佩。
無論是事件捕獲還是事件冒泡,它們都有一個共同的行為坯台,就是事件傳播炬丸,它就像一跟引線,只有通過引線才能將綁在引線上的鞭炮(事件監(jiān)聽器)引爆蜒蕾,試想一下稠炬,如果引線不導(dǎo)火了,那鞭炮就只有一響了_浞取J灼簟!
dom標(biāo)準(zhǔn)事件流的觸發(fā)的先后順序為:先捕獲再冒泡撤摸,即當(dāng)觸發(fā)dom事件時闽坡,會先進(jìn)行事件捕獲,捕獲到事件源之后通過事件傳播進(jìn)行事件冒泡愁溜。
事件監(jiān)聽
與這兩個事件密切相關(guān)的是addEventListener疾嗅、attachEvent:
addEventListener(event, listener, useCapture)
參數(shù)定義:
event---(事件名稱,如click冕象,不帶on)
listener---事件監(jiān)聽函數(shù)
useCapture---是否采用事件捕獲進(jìn)行事件捕捉代承,默認(rèn)為false,即采用事件冒泡方式
addEventListener在 IE11渐扮、Chrome 论悴、Firefox掖棉、Safari等瀏覽器都得到支持。
attachEvent(event,listener)
參數(shù)定義:
event---(事件名稱膀估,如onclick幔亥,帶on)
listener---事件監(jiān)聽函數(shù)。
attachEvent主要用于IE瀏覽器察纯,并且僅在IE10及以下才支持帕棉,IE11已經(jīng)不在使用這個方法。
阻止事件冒泡
w3c的方法是e.stopPropagation()饼记,IE則是使用e.cancelBubble = true
evt.stopPropagation();
evt.cancelBubble = true;
在處理瀏覽器兼容問題時香伴,可以這樣:
if(evt.stopPropagation){
evt.stopPropagation();
}else{
evt.cancelBubble = true;
}
還有一種以阻止默認(rèn)事件的方式去阻止冒泡行為
return false
區(qū)別
event.stopPropagation();
事件處理過程中,阻止了事件冒泡具则,但不會阻擊默認(rèn)行為return false;
事件處理過程中即纲,阻止了事件冒泡,也阻止了默認(rèn)行為event.preventDefault();
它的作用是:事件處理過程中博肋,不阻擊事件冒泡低斋,但阻擊默認(rèn)行為
————愿你在迷茫時,堅信你的珍貴匪凡,愛你所愛膊畴,行你所行,聽從你心锹雏,無問西東巴比。