1. 程式人生 > >事件冒泡、事件捕獲與事件委託

事件冒泡、事件捕獲與事件委託

事件流

:描述的是從頁面中接收事件的順序。IE和Netscape開發團隊居然提出了差不多是相反的事件流的概念。
IE的事件流是事件冒泡流
Netscape的事件流是事件捕獲流。

事件冒泡

事件冒泡(event bubbling),即事件開始由最具體的元素(文件中巢狀層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文件)。
舉個例子:




事件冒泡


Click Me

如果單擊頁面中的button元素,那麼這個click事件會按照如下順序傳播
(1)
(2)
(3)
(4)document
也就是說,click事件首先在元素上發生,而這個元素就是我們單擊的元素。然後,click事件沿著DOM樹向上傳播,在每一級節點上都會發生,直至傳播到document物件。
事件冒泡過程:

事件捕獲(event capturing)

事件捕獲的思想是不太具體的節點應該更早接收到事件,而最具體的節點應該最後接收到事件。
事件捕獲的用意在於事件到達預訂目標之前捕獲它。
同樣以上例子為例
單擊元素就會以下列順序觸發click事件
document



在事件捕獲過程中,docu物件首先接收到click事件,然後事件沿著DOM樹依次向下,一直傳播到事件的實際目標,即元素,如下圖:

DOM事件流
規定事件流包括三個階段:事件捕獲階段、處於目標階段和事件冒泡階段。
首先事件捕獲:為截獲事件提供機會,然後是實際的目標接收到事件,最後一個階段是冒泡階段,可以在這個階段對事件作出響應。

事件的傳播是可以阻止的:
• 在W3c中,使用stopPropagation()方法
• 在IE下設定cancelBubble = true;
在捕獲的過程中stopPropagation();後,後面的冒泡過程也不會發生了~
3.阻止事件的預設行為,例如click 後的跳轉~
• 在W3c中,使用preventDefault()方法;
• 在IE下設定window.event.returnValue = false
借鑑的
這篇文章講的挺好,不再贅述。舉個例子,取消事件冒泡的

<!DOCTYPE html>
<html>
<head lang
="en">
<meta charset="UTF-8"> <title></title> </head> <body> <button id="btn">點選</button> </body> </html> <script> var btn = document.getElementById("btn"); document.onclick = function() { alert("點選了空白處"); } btn.onclick = function(event) { alert("點選了按鈕"); var event = event || window.event; if(event && event.stopPropagation) { event.stopPropagation(); // w3c 標準 } else { event.cancelBubble = true; // ie 678 ie瀏覽器 } } </script>

事件委託

事件委託利用了事件冒泡,之指定一個事件處理程式,就可以管理某一型別的所有事件。
例如,click事件會一直冒泡到document層次,也就是說,我們可以為整個頁面指定一個onclick事件處理程式,而不必給每個可單擊的元素分別新增事件處理程式。

什麼是事件委託:通俗的講,事件就是onclick,onmouseover,onmouseout,等就是事件,委託呢,就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件。
  舉個列子:有三個同事預計會在週一收到快遞。為簽收快遞,有兩種辦法:一是三個人在公司門口等快遞;二是委託給前臺MM代為簽收。現實當中,我們大都採用委託的方案(公司也不會容忍那麼多員工站在門口就為了等快遞)。前臺MM收到快遞後,她會判斷收件人是誰,然後按照收件人的要求籤收,甚至代為付款。這種方案還有一個優勢,那就是即使公司裡來了新員工(不管多少),前臺MM也會在收到寄給新員工的快遞後核實並代為簽收。
原理:
  利用冒泡的原理,把事件加到父級上,觸發執行效果。
作用:
1.效能要好
2.針對新建立的元素,直接可以擁有事件
事件源 :
  跟this作用一樣(他不用看指向問題,誰操作的就是誰),event物件下的
使用情景:
  •為DOM中的很多元素繫結相同事件;
  •為DOM中尚不存在的元素繫結事件;