事件冒泡與事件捕獲

事件冒泡階段:事件從事件目標(target)開始,往上冒泡直到頁面的最上一級標籤。

假設一個元素div,它有一個下級元素p。
<div>
  <p>元素</p>
</div>
這兩個元素都綁定了click事件,如果用戶點擊了p,它在div和p上都觸發了click事件,那這兩個事件處理程序哪個先執行呢?事件順序是什麼?

兩種模型
以前,Netscape和Microsoft是不同的實現方式。
Netscape中,div先觸發,這就叫做事件捕獲。
Microsoft中,p先觸發,這就叫做事件冒泡。
兩種事件處理順序剛好相反。IE只支持事件冒泡,Mozilla, Opera 7 和 Konqueror兩種都支持,舊版本的Opera's 和 iCab兩種都不支持 。
事件捕獲
當你使用事件捕獲時,父級元素先觸發,子級元素後觸發,即div先觸發,p後觸發。
事件冒泡
當你使用事件冒泡時,子級元素先觸發,父級元素後觸發,即p先觸發,div後觸發。
W3C模型
W3C模型是將兩者進行中和,在W3C模型中,任何事件發生時,先從頂層開始進行事件捕獲,直到事件觸發到達了事件源元素。然後,再從事件源往上進行事件冒泡,直到到達document。
程序員可以自己選擇綁定事件時採用事件捕獲還是事件冒泡,方法就是綁定事件時通過addEventListener函數,它有三個參數,第三個參數若是true,則表示採用事件捕獲,若是false,則表示採用事件冒泡。
ele.addEventListener('click',doSomething2,true)
true=捕獲
false=冒泡
傳統綁定事件方式
在一個支持W3C DOM的瀏覽器中,像這樣一般的綁定事件方式,是採用的事件冒泡方式。
ele.onclick = doSomething2
IE瀏覽器
如上面所說,IE只支持事件冒泡,不支持事件捕獲,它也不支持addEventListener函數,不會用第三個參數來表示是冒泡還是捕獲,它提供了另一個函數attachEvent。
ele.attachEvent("onclick", doSomething2);
附:事件冒泡(的過程):事件從發生的目標(event.srcElement||event.target)開始,沿着文檔逐層向上冒泡,到document爲止。
事件的傳播是可以阻止的:
• 在W3c中,使用stopPropagation()方法
• 在IE下設置cancelBubble = true;
在捕獲的過程中stopPropagation();後,後面的冒泡過程也不會發生了~
3.阻止事件的默認行爲,例如click <a>後的跳轉~
• 在W3c中,使用preventDefault()方法;
• 在IE下設置window.event.returnValue = false;
發佈了17 篇原創文章 · 獲贊 14 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章