目的: 了解 Web DOM的 event 處理 機制
處理說明: 1> catch 時, 由上而下 (Document --> html --> body --> table --> tr --> td --> div)
2> bubble時, 由下而上(div-->td--> tr--> table --> body --> html --> Document)
--> DOM 兩種機制 (catch/bubble) 均有, 可分別設定 catch / bubble 的 event handler
參考原始網址: https://ithelp.ithome.com.tw/articles/10191970
而事件流程 (Event Flow) 指的就是「網頁元素接收事件的順序」。
事件流程可以分成兩種機制:
- 事件冒泡 (Event Bubbling)
- 事件捕獲 (Event Capturing)
假設現在的事件是點擊上圖中藍色的 <td>
。
那麼當 td 的 click
事件發生時,會先走紅色的 「capture phase」:
Document
<html>
<body>
<table>
<tbody>
<tr>
<td>
(實際被點擊的元素)
由上而下依序觸發它們的 click
事件。
然後再繼續執行綠色的 「bubble phase」,反方向由 <td>
一路往上傳至 Document
,整個事件流程到此結束。
Ex: DOM的實作案例
<div><div id="parent">父元素
</div>
</div>
當我點擊的是「子元素」的時候,透過 console.log
可以觀察到事件觸發的順序為:
"Parent Capturing"
"Child Capturing"
"Child Bubbling"
"Parent Bubbling"
由此可知,點擊子元素的時候,父層的 Capturing
會先被觸發,然後再到子層內部的 Capturing
或 Bubbling
事件。 最後才又回到父層的 Bubbling
結束。
子層的 Capturing
或 Bubbling
誰先誰後呢?
要看你程式碼的順序而定。
子層若是 Capturing
在 Bubbling
前面:
addEventListener()
基本上有三個參數,分別是「事件名稱」、「事件的處理器」(事件觸發時執行的 function
),以及一個「Boolean」值,由這個 Boolean 決定事件是以「捕獲」或「冒泡」機制執行,若不指定則預設為「冒泡」。
沒有留言:
張貼留言