1. 程式人生 > >10th Week Blog 4 Event Flow

10th Week Blog 4 Event Flow

Event flow(事件流)

流的概念,在現今的JavaScript中隨處可見。比如說React中的單向資料流,Node中的流,又或是今天本文所講的DOM事件流。都是流的一種生動體現。至於流的具體概念,我們採用下文的解釋:

用術語說流是對輸入輸出裝置的抽象。以程式的角度說,流是具有方向的資料

事件流之事件冒泡與事件捕獲

在瀏覽器發展的過程中,開發團隊遇到了一個問題。那就是頁面中的哪一部分擁有特定的事件?

可以想象畫在一張紙上的一組同心圓,如果你把手指放在圓心上,那麼你的手指指向的其實不是一個圓,而是紙上所有的圓。放到實際頁面中就是,你點選一個按鈕,事實上你還同時點選了按鈕所有的父元素。

開發團隊的問題就在於,當點選按鈕時,是按鈕最外層的父元素先收到事件並執行,還是具體元素先收到事件並執行?所以這兒引入了事件流的概念。

事件流所描述的就是從頁面中接受事件的順序。

因為有兩種觀點,所以事件流也有兩種,分別是事件冒泡和事件捕獲。現行的主流是事件冒泡。

 

 

 

  1. 1.      Capture

定義:

The event object propagate through the target's ancestors from the defaultView to the target's parent.
事件物件在事件目標的祖先中上到下順向傳播,從最頂層的defaultView到事件目標的(直系)父元素。

捕獲階段發生在整個流動的開始。在這階段裡事件會從父(主幹)到子(分支)由上往下傳播,被元素一層層的捕獲。

一般沒太大需要監聽捕獲階段的事件;如果確實希望這麼做,需要將addEventlistener的第三個引數設定為ture

// 第三個引數設定是否為捕獲階段,預設為false

element.addEventListener('click', function() {}, true)

 

  1. 2.      target

定義:

The event object arrive at the event object's event target.

事件物件到達事件目標。

addEventListener可以監聽目標階段的事件:

element.addEventListener('click', function() {})

如果事件是不可冒泡的,那整個事件流動會到此為止,不會發生下面的冒泡階段

  1. 3.      bubble

定義:

The event object propagates through the target's ancestors in reverse order, starting with the target's parent and ending with the defaultView.
事件物件會在事件目標的祖先元素裡反向傳播,由開始的父元素到最後的defaultView(document)

冒泡階段發生在最後,在這個階段事件會從子(分支)到父(主幹)逆向傳播,看起來像是一個水裡的泡泡往上冒

 

總結:若一個元素(div)是目標元素(button)的祖先,那事件物件會在該元素上觸發兩次:一次在捕獲階段,另一次實在冒泡階段,當事件物件在事件目標元素(button)上觸發是,事件流動進入了目標階段

摘自 https://www.cnblogs.com/lizhidage/