1. 程式人生 > >Event flow

Event flow

事件流動

DOM事件不單單隻會在一個Element上觸發,它還會流向其他Element。事件的流動通常會經歷這麼三個階段:

 

捕獲階段(capture phase):

事件物件在事件目標的祖先中上到下順向傳播,從最頂層的defaultView到事件目標的(直系)父元素。

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

 

目標階段(target phase):

事件物件到達事件目標。

 

冒泡階段(bubble phase):

事件物件會在事件目標的祖先元素裡反向傳播,由開始的父元素到最後的defaultView(document)。

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

 

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

  • 想監聽捕獲階段的事件,可以這樣:element.addEventListener('click', cb, true),將第三個引數設定為true。
  • 想監聽冒泡階段的事件,可以這樣:element.addEventListener('click', cb,)
    ,不使用第三個引數或將其設定為false。
  • 而上述的任何一種監聽方式都可以監聽到目標階段的事件。