今日任務: 認識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 技術共筆部落格