小歷史:
事件傳播的不同還要從早先的兩家瀏覽器巨頭說起,網景和IE為了能爭奪市場,互相使用相反的技術,當網景使用事件捕獲流的時候,IE則使用事件冒泡流。后來W3C為了能規范規定,直接折中,當事件發生時,先發生向下傳播,當到底了以后再次使用事件冒泡,逐漸的冒泡到根節點。
事件傳播分三個階段:
DOM事件流(event flow )存在三個階段:事件捕獲階段、處于目標階段、事件冒泡階段。
- 在事件捕獲階段,事件從document對象沿著文檔樹向下傳播給目標節點。如果目標的任何一個祖先注冊了捕捉事件句柄,那么在事件傳播的過程中,就會運行這些句柄(IE10及以下不支持捕獲型事件)。
- 目標階段發生在目標節點自身,這與0級事件模型提供的事件處理方法類似。
-
事件冒泡階段,在這個階段,事件將從目標元素向上傳播回(像冒泡)Document對象的文檔層次(IE8 及以下沒有捕獲階段)。
事件傳播示意圖
無論是事件捕獲還是事件冒泡,它們都有一個共同的行為,就是事件傳播,它就像一跟引線,只有通過引線才能將綁在引線上的鞭炮(事件監聽器)引爆,試想一下,如果引線不導火了,那鞭炮就只有一響了!!!
dom標準事件流的觸發的先后順序為:先捕獲再冒泡,即當觸發dom事件時,會先進行事件捕獲,捕獲到事件源之后通過事件傳播進行事件冒泡。
事件監聽
與這兩個事件密切相關的是addEventListener、attachEvent:
addEventListener(event, listener, useCapture)
參數定義:
event---(事件名稱,如click,不帶on)
listener---事件監聽函數
useCapture---是否采用事件捕獲進行事件捕捉,默認為false,即采用事件冒泡方式
addEventListener在 IE11、Chrome 、Firefox、Safari等瀏覽器都得到支持。
attachEvent(event,listener)
參數定義:
event---(事件名稱,如onclick,帶on)
listener---事件監聽函數。
attachEvent主要用于IE瀏覽器,并且僅在IE10及以下才支持,IE11已經不在使用這個方法。
阻止事件冒泡
w3c的方法是e.stopPropagation(),IE則是使用e.cancelBubble = true
evt.stopPropagation();
evt.cancelBubble = true;
在處理瀏覽器兼容問題時,可以這樣:
if(evt.stopPropagation){
evt.stopPropagation();
}else{
evt.cancelBubble = true;
}
還有一種以阻止默認事件的方式去阻止冒泡行為
return false
區別
event.stopPropagation();
事件處理過程中,阻止了事件冒泡,但不會阻擊默認行為return false;
事件處理過程中,阻止了事件冒泡,也阻止了默認行為event.preventDefault();
它的作用是:事件處理過程中,不阻擊事件冒泡,但阻擊默認行為
————愿你在迷茫時,堅信你的珍貴,愛你所愛,行你所行,聽從你心,無問西東。