了解 addEventListener 的運作
目標
- 了解 addEventListener 的運作
- 事件冒泡 (Event Bubbling)
- 停止冒泡行為 e.stopPropagation()
- 事件捕獲 (Event Capturing)
- 單次觸發
- 事件冒泡 (Event Bubbling)
成品
學習紀錄
事件傳遞順序
使用 addEventListener
時,不管是設定 Event Bubbling
或 Event Capturing
,
當Event被觸發時,都是會先從 最外層DOM 走到 target的DOM 然後再走回 最外層DOM,
所以當你設定
- Event Bubbling(綠色路徑):只回傳 target的DOM →→ 最外層DOM 的路徑
- Event Capturing(紅色路徑):只回傳 最外層DOM →→ target的DOM 的路徑
所以根據上面的規則,套用在下面的案例的話
1 | <div class="one purple"> |
事件冒泡 (Event Bubbling):只回傳 target的DOM →→ 最外層DOM 的路徑
1 | function logText(e) { |
事件捕獲 (Event Capturing):只回傳 最外層DOM →→ target的DOM 的路徑
1 | function logText(e) { |
停止冒泡行為 e.stopPropagation()
有時只是想單純針對單一元素監聽,不想因為事件冒泡的行為,
而去觸發到其他元素,這時就可利用 e.stopPropagation()
來達成此需求。
1 | function logText(e) { |
注意:
使用
若是設定為 事件捕獲 (Event Capturing) 的話,則不適用
使用
e.stopPropagation()
僅針對 事件冒泡 (Event Bubbling) 設定,若是設定為 事件捕獲 (Event Capturing) 的話,則不適用
e.stopPropagation()
。單次觸發
once 屬性:當第一次被觸發後,就會移除本身的監聽事件,後續就沒有監聽事件。
目前想到的可運用在表單submit後,解除監聽事件,避免重覆送單。
1 | // 在 button 的 addEventListener 第三個參數裡,設定 once 的屬性 |