簡單來說,就是事件在 DOM 裡面傳遞的順序,以及你可以對這些事件做什麼。
為什麼會有「傳遞順序」這一詞呢?假設你有一個 ul 元素,底下有很多 li,代表不同的 item。當你點擊任何一個 li 的時候,其實你也點擊了 ul,因為 ul 把所有的 li 都包住了。
先來看這張圖:
![](https://miro.medium.com/max/2038/1*NrgJ4ygwxBGs4RohkH1FDA.png =400x400)
當我們觸發某元素的事件時,會出現三個事件階段:
addEventListener('事件', callback, boolean)
當 boolean 為 true,設定「監聽事件」在捕獲階段。
當 boolean 為 false,設定「監聽事件」在冒泡階段。
範例程式碼:
![image alt](https://i.imgur.com/LfkcXlA.png =400x400)
HTML:
<div class="outer">
<div class="inner">
<button class="btn">click me</button>
</div>
</div>
JS:
document.addEventListener('DOMContentLoaded',function(){
addEvent('.outer')
addEvent('.inner')
addEvent('.btn')
function addEvent(className) {
document.querySelector(className)
.addEventListener('click',function(e) {
console.log(className, '捕獲')
}, true)
document.querySelector(className)
.addEventListener('click',function(e) {
console.log(className, '冒泡')
}, false)
}
})
當我點擊 click 的時候,捕獲階段跟冒泡階段都有 log 出來。