認識事件:在開始程式碼之前先來認識,事件模型涉及的重要概念:事件捕獲、事件冒泡和事件傳播:
document
)開始,然後逐級向下傳播到目標元素。總結來說,事件捕獲、事件冒泡和事件傳播是描述事件處理的不同階段和方式。事件捕獲從根元素向下捕獲事件,事件冒泡從目標元素向上冒泡事件,事件傳播包括這兩個階段,並提供了控制事件處理流程的靈活性。根據需求,您可以選擇在事件的不同階段進行處理,以實現不同的功能和互動。
接著我們來看程式碼
// 先取得作者設計好的三層div
const divs = document.querySelectorAll("div");
function handleClick(e) {
console.log(this.classList.value);
}
<div>
都新增點擊事件監聽器divs.forEach((div) => div.addEventListener("click", handleClick));
three > two > one
true
。divs.forEach((div) => div.addEventListener("click", handleClick, true));
這時候一樣點擊橘色區塊,你會發現觸發事件監聽器的順序反過來了one > two > three
顯然已經更改為捕獲階段觸發。
想當然爾也可以兩個階段都有事件監聽器,執行結果如何就留給各位嘗試囉!
divs.forEach((div) => div.addEventListener("click", handleClick, true));
divs.forEach((div) => div.addEventListener("click", handleClick));
useCapture
只是如果你單獨使用一個布林值那麼瀏覽器會很聰明地幫你認定為useCapture
設定,其他可選用的設定還有capture(同第三個參數只帶一個true)
、once
、passive
、signal
都必須包在一個物件內使用capture(捕獲階段):如果設置為 true
,事件將在捕獲被觸發。預設值為 false
,表示事件在冒泡階段被觸發。
once(一次性監聽):如果設置為 true
,事件監聽器在觸發後自動刪除
以下範例為 capture 和 once 的結合
element.addEventListener("click", eventHandler, {
capture: true,
once: true,
});
true
,告訴瀏覽器該事件不會調用preventDefault()
,从而可以进行一些性能优化。这在滚动事件等高频事件中很有用。AbortController
信號來取消事件監聽器。這在某些情況下區要取消事件監聽器很有幫助。const controller = new AbortController();
element.addEventListener("click", eventHandler, { signal: controller.signal });
// 取消事件監聽
controller.abort();
停止事件傳播:最後既然有事件傳播,那麼就有方法停止傳播,我只想要在觸發一次事件後阻止其他監聽器執行,那麼只要在 linstener 含式內寫下event.stopPropagation()
即可。
function handleClick(e) {
// 停止事件傳播
e.stopPropagation();
console.log(this.classList.value);
}
那麼今天就到這邊,大家還是要動手全部時做一次才會印象深刻哦!