[程式碼&DEMO] [HackMD完整筆記]
解析addEventListener中:
HTML部分:
共三層
<div class="one">
<div class="two">
<div class="three">
</div>
</div>
</div>
JS部分:
// 取得頁面的所有div
const divs = document.querySelectorAll('div');
function logText(e) {
// 印出目前div的class name
console.log(this.classList.value);
}
// 每個div都加上click事件監聽
divs.forEach(div => div.addEventListener('click', logText));
監聽事件語法:EventTarget.addEventListener('type', callback, option)
將指定的事件監聽器註冊到 EventTarget 實作物件上。EventTarget 可能是 Document 中的 Element 物件、Document 物件本身、Window 物件,或是其它支援事件的物件。
[參數]
type
事件名稱callback
options
(可選)capture
(預設為false)once
(預設為false)passive
mozSystemGroup
**1 capture **
const divs = document.querySelectorAll('div');
function logText(e){
console.log(this.classList.value); //three, two, one
}
divs.forEach(div => div.addEventListener('click', logText, {
capture : false,
once : false,
註冊一個監聽器時,會由外向內
去「捕捉」(Capture)
這個監聽器的位置。
當位置被觸發時,會由內向外
去「冒泡」(bubbling)
。
capture:false(預設,不處理「捕捉」的過程,只處理「冒泡的過程」。)
事件:點擊最內圈的div
結果:three=>two=>one。
const divs = document.querySelectorAll('div');
function logText(e){
console.log(this.classList.value); //one, two, three
}
divs.forEach(div => div.addEventListener('click', logText, {
capture : true,
once : false,
}));
capture:true(不會執行冒泡)
結果:one=>two=>three。
**2 stopPropagation() **
const divs = document.querySelectorAll('div');
function logText(e){
console.log(this.classList.value);
//capture:true->one, capture:false->three
e.stopPropagation();
}
divs.forEach(div => div.addEventListener('click', logText, {
capture : true,
once : false,
}));
不管在bubbling或capture中加入了e.stopPropagation()時,都會中斷過程。
capture:ture => 結果:one
capture:false => 結果:three
**3 once **
button.addEventListener('click', () => {
console.log('Click!!!');
}, {
once: true
});
按鈕click後,直接unbind這個元素與事件,
之後這個按鈕就將不會再被觸發click事件。