(1)冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對(duì)象)的順序觸發(fā)屈扎。
(2)捕獲型事件(event capturing):事件從最不精確的對(duì)象(document 對(duì)象)開(kāi)始觸發(fā),然后到最精確(也可以在窗口級(jí)別捕獲事件亡容,須由開(kāi)發(fā)人員特別指定)祠够。
(3)DOM事件流:同時(shí)支持兩種事件模型:捕獲型事件和冒泡型事件,但是露泊,捕獲型事件先發(fā)生脆淹。
兩種事件流會(huì)觸及DOM中的所有對(duì)象巾钉,從document對(duì)象開(kāi)始,也在document對(duì)象結(jié)束坯约。?
?DOM事件模型最獨(dú)特的性質(zhì)是熊咽,文本節(jié)點(diǎn)也觸發(fā)事件(在IE中不會(huì))。
支持W3C標(biāo)準(zhǔn)的瀏覽器在添加事件時(shí)用addEventListener(event,fn,useCapture)方法闹丐,基中第3個(gè)參數(shù)useCapture是一個(gè)Boolean值横殴,用來(lái)設(shè)置事件是在事件捕獲時(shí)執(zhí)行,還是事件冒泡時(shí)執(zhí)行卿拴。
而不兼容W3C的瀏覽器(IE)用attachEvent()方法衫仑,此方法沒(méi)有相關(guān)設(shè)置梨与,不過(guò)IE的事件模型默認(rèn)是在事件冒泡時(shí)執(zhí)行的,也就是在useCapture等于false的時(shí)候執(zhí)行惑畴,所以把在處理事件時(shí)把useCapture設(shè)置為false是比較安全蛋欣,也實(shí)現(xiàn)兼容瀏覽器的效果。
事件捕獲階段:事件從最上一級(jí)標(biāo)簽開(kāi)始往下查找如贷,直到捕獲到事件目標(biāo)(target)陷虎。事件冒泡階段:事件從事件目標(biāo)(target)開(kāi)始,往上冒泡直到頁(yè)面的最上一級(jí)標(biāo)簽杠袱。
假設(shè)一個(gè)元素div尚猿,它有一個(gè)下級(jí)元素p。
<div>
<p>元素</p>
</div>
這兩個(gè)元素都綁定了click事件楣富,如果用戶點(diǎn)擊了p凿掂,它在div和p上都觸發(fā)了click事件,那這兩個(gè)事件處理程序哪個(gè)先執(zhí)行呢纹蝴?事件順序是什么庄萎? 兩種模型以前,Netscape和Microsoft是不同的實(shí)現(xiàn)方式塘安。Netscape中糠涛,div先觸發(fā),這就叫做事件捕獲兼犯。Microsoft中忍捡,p先觸發(fā),這就叫做事件冒泡切黔。
IE只支持事件冒泡砸脊,Mozilla, Opera 7 和 Konqueror兩種都支持,舊版本的Opera's 和 iCab兩種都不支持?
事件捕獲當(dāng)你使用事件捕獲時(shí)纬霞,父級(jí)元素先觸發(fā)凌埂,子級(jí)元素后觸發(fā),即div先觸發(fā)诗芜,p后觸發(fā)侨舆。
事件冒泡當(dāng)你使用事件冒泡時(shí),子級(jí)元素先觸發(fā)绢陌,父級(jí)元素后觸發(fā),即p先觸發(fā)熔恢,div后觸發(fā)脐湾。
W3C模型
W3C模型是將兩者進(jìn)行中和,在W3C模型中叙淌,任何事件發(fā)生時(shí)秤掌,先從頂層開(kāi)始進(jìn)行事件捕獲愁铺,直到事件觸發(fā)到達(dá)了事件源元素。
然后闻鉴,再?gòu)氖录赐线M(jìn)行事件冒泡茵乱,直到到達(dá)document。程序員可以自己選擇綁定事件時(shí)采用事件捕獲還是事件冒泡孟岛,方法就是綁定事件時(shí)通過(guò)addEventListener函數(shù)瓶竭,它有三個(gè)參數(shù),第三個(gè)參數(shù)若是true渠羞,則表示采用事件捕獲斤贰,若是false,則表示采用事件冒泡次询。ele.addEventListener('click',doSomething2,true)true=捕獲false=冒泡傳統(tǒng)綁定事件方式在一個(gè)支持W3C DOM的瀏覽器中荧恍,像這樣一般的綁定事件方式,是采用的事件冒泡方式屯吊。
ele.onclick = doSomething2IE瀏覽器如上面所說(shuō)送巡,IE只支持事件冒泡,不支持事件捕獲盒卸,它也不支持addEventListener函數(shù)骗爆,不會(huì)用第三個(gè)參數(shù)來(lái)表示是冒泡還是捕獲,它提供了另一個(gè)函數(shù)attachEvent世落。ele.attachEvent("onclick", doSomething2);
附:事件冒泡(的過(guò)程):事件從發(fā)生的目標(biāo)(event.srcElement||event.target)開(kāi)始淮腾,沿著文檔逐層向上冒泡,到document為止屉佳。
事件的傳播是可以阻止的:? 在W3c中谷朝,使用stopPropagation()方法??