1、事件傳播——冒泡與捕獲
默認(rèn)情況下光戈,事件使用冒泡事件流哪痰,不使用捕獲事件流。然而久妆,在Firefox和Safari里晌杰,你可以顯式的指定使用捕獲事件流,方法是在注冊事件時傳入useCapture參數(shù)筷弦,將這個參數(shù)設(shè)為true肋演。
2、冒泡事件流
當(dāng)事件在某一DOM元素被觸發(fā)時烂琴,例如用戶在客戶名字節(jié)點上點擊鼠標(biāo)爹殊,事件將跟隨著該節(jié)點繼承自的各個父節(jié)點冒泡穿過整個的DOM節(jié)點層次,直到它遇到依附有該事件類型處理器的節(jié)點奸绷,此時梗夸,該事件是onclick事件。在冒泡過程中的任何時候都可以終止事件的冒泡健盒,在遵從W3C標(biāo)準(zhǔn)的瀏覽器里可以通過調(diào)用事件對象上的stopPropagation()方法绒瘦,在Internet Explorer里可以通過設(shè)置事件對象的cancelBubble屬性為true称簿。如果不停止事件的傳播,事件將一直通過DOM冒泡直至到達(dá)文檔根惰帽。
3憨降、捕獲事件流
事件的處理將從DOM層次的根開始,而不是從觸發(fā)事件的目標(biāo)元素開始该酗,事件被從目標(biāo)元素的所有祖先元素依次往下傳遞授药。在這個過程中,事件會被從文檔根到事件目標(biāo)元素之間各個繼承派生的元素所捕獲呜魄,如果事件監(jiān)聽器在被注冊時設(shè)置了useCapture屬性為true,那么它們可以被分派給這期間的任何元素以對事件做出處理悔叽;否則,事件會被接著傳遞給派生元素路徑上的下一元素爵嗅,直至目標(biāo)元素娇澎。事件到達(dá)目標(biāo)元素后,它會接著通過DOM節(jié)點再進(jìn)行冒泡睹晒。
addEventListener第三個參數(shù)useCapture 趟庄,true時為捕獲,false時為冒泡
捕獲階段是在冒泡階段前面
代碼示例1
4伪很、阻止冒泡
w3c的方法是e.stopPropagation()戚啥,IE則是使用e.cancelBubble = true;
5锉试、阻止默認(rèn)行為
w3c的方法是e.preventDefault()猫十,IE則是使用e.returnValue = false;
代碼示例2:代碼示例1添加里組織冒泡行為
當(dāng)點擊id3:執(zhí)行結(jié)果:id2
當(dāng)點擊id2:執(zhí)行結(jié)果:id2
當(dāng)點擊id1:執(zhí)行結(jié)果:id1
通過這個例子發(fā)現(xiàn)呆盖,原來阻止了事件冒泡拖云,也阻止了事件繼續(xù)向下級捕獲。
總結(jié):
關(guān)于JS 事件冒泡和onclick,click,on()事件觸發(fā)順序
onclick,click,on()的優(yōu)先關(guān)系:onclick>click>on()絮短;
onclick和click綁定的事件江兢,彼此之間遵守事件冒泡規(guī)則,從內(nèi)到外觸發(fā)丁频;
on()綁定的事件杉允,總是晚于onclick和click綁定的事件觸發(fā);