今日任務: 認識DOM 事件傳遞方式

捕獲階段 (Capture Phase)目標階段 (Target Phase)冒泡階段 (Bubbling Phase)element.addEventListener(event, function, useCapture)
element.addEventListener(event, function, options)
event: 監聽事件名稱(詳細Dom事件)。function: 事件觸發時執行的函式。useCapture,可用boolean值決定事件傳遞方式,預設為false監聽冒泡階段 (Bubbling Phase),true為監聽捕獲階段 (Capture Phase)。options: 決定事件傳遞方式。可用的選項有:
capture:once:passive:preventDefault(),預設為false。可以使用e.eventPhase查看目前事件正在什麼階段。e.eventPhase:事件(Event)當前正在事件流的哪個階段。
Event.NONE (0): 目前未處理該事件。Event.CAPTURING_PHASE (1): 事件正在捕獲階段 (Capture Phase)。Event.AT_TARGET (2): 事件正在目標階段 (Target Phase)。Event.BUBBLING_PHASE (3): 事件正在冒泡階段 (Bubbling Phase)。<div class="one">
<div class="two">
<div class="three"></div>
</div>
</div>
當沒有第三個參數時,預設是冒泡階段觸發function,
所以當點擊的時候,瀏覽器會從最外面偵測到最裡面,抓到你點擊的地方是哪裡,
找到target(這裡為three)後,由內往外傳遞事件觸發function
const divs = document.querySelectorAll('div');
divs.forEach((div) =>
div.addEventListener('click', logText)
);
function logText(e) {
console.log(this.classList.value, e.eventPhase);
}
點了最裡面的,但是會連父層的都顯示出來
const divs = document.querySelectorAll('div');
divs.forEach((div) =>
div.addEventListener('click', logText, {
capture: true,
})
);
function logText(e) {
console.log(this.classList.value, e.eventPhase);
}

const divs = document.querySelectorAll('div');
divs.forEach((div) =>
div.addEventListener('click', logText, {
capture: false,
})
);
function logText(e) {
console.log(this.classList.value, e.eventPhase);
e.stopPropagation();
}

將capture改為true
const divs = document.querySelectorAll('div');
divs.forEach((div) =>
div.addEventListener('click', logText, {
capture: false,
once: true,
})
);
function logText(e) {
console.log(this.classList.value, e.eventPhase);
}

今日學習到的:
事件傳遞方式總共分為三大階段:
捕獲階段 (Capture Phase)目標階段 (Target Phase)冒泡階段 (Bubbling Phase)event: 監聽事件名稱。function: 事件觸發時執行的函式。useCapture,可用boolean值決定事件傳遞方式,預設為false監聽冒泡階段 (Bubbling Phase),true為監聽捕獲階段 (Capture Phase)。options: 決定事件傳遞方式。可用的選項有:
capture:once:passive:preventDefault(),預設為false。e.eventPhase:事件(Event)當前正在事件流的哪個階段。
Event.NONE (0): 目前未處理該事件。Event.CAPTURING_PHASE (1): 事件正在捕獲階段 (Capture Phase)。Event.AT_TARGET (2): 事件正在目標階段 (Target Phase)。Event.BUBBLING_PHASE (3): 事件正在冒泡階段 (Bubbling Phase)。效果連結:連結
參考連結:
EventTarget.addEventListener()
Javascript 中的 DOM 事件傳遞機制:捕獲與冒泡 (capturing and bubbling)
DOM 的事件傳遞機制:捕獲與冒泡 - TechBridge 技術共筆部落格