第25天的主要講解元素事件觸發時的觸發順序。
這次的實作是由三個div
相互包裹著。
在每一個div
中建立click
事件,在事件都是對應同樣的函示。
divs.forEach(div => div.addEventListener('click', logText, {
capture:false,
}))
當按下three的div
元素時,會發現console.log()
的結果為three、two、one,當按two的div
元素時,其結果為two、one,以此類推,若是在body中加入同樣的函示,當點下three的div
元素,其結果為three、two、one。
這時就會發現若是觸發three的div
元素,其顯示結果為three、two、one、body。
document.body.addEventListener('click', logText)
這時發現event的傳遞結果為向上傳遞的,此事件傳遞的方式叫冒泡bubbling
。
而另外一種事件傳遞的方式為capturing
,而capturing
的傳遞方式是從根節點傳遞至目標節點。
因此事件的傳遞設定如下,當click
事件觸發時,結果為one、two、three。
divs.forEach(div => div.addEventListener('click', logText, {
capture: false,
}));
如果為避免bubbling
、capturing
的事情發生,可以事件中加入e.stopPropagation()
,來避免事件的傳遞。若使用e.stopPropagation()
時,要知道事件傳遞的方式為bubbling
還是capturing
,這樣才可避免事件觸發到錯的目標節點。
接下來在事件中加入once
,當事件被觸發時,該事件就只能觸發一次。
button.addEventListener('click', () => {
console.log('Click!!!');
}, {
once: true
});
<div class="one">
one
<div class="two">
two
<div class="three">
three
</div>
</div>
</div>
EventTarget.addEventListener()
EventTarget.addEventListener() 方法能將指定的事件監聽器註冊到 EventTarget 實作物件上。EventTarget 可能是 Document 中的 Element 物件、Document 物件本身、Window 物件,或是其它支援事件的物件(如:XMLHttpRequest)。
[2]
target.addEventListener(type, listener[, options]);
options
capture:當capture
為true
時,事件順序為capture
。
once:當once
為true
時,代表事件只觸發一下,之會在無法觸發該元素。
passive:當passive
為ture
時,省略preventDefault()
的方法。
passive:A Boolean indicating that the listener will never call preventDefault(). If it does, the user agent should ignore it and generate a console warning.
Event.eventPhase
表示事件物件目前於事件流(Event Flow)中傳遞的進度為哪一個階段。
Event.preventDefault()
如果事件可以被取消,就取消事件(即取消事件的預設行為)。但不會影響事件的傳遞,事件仍會繼續傳遞。
EventTarget.removeEventListener()EventTarget.removeEventListener()
方法可以移除先前由 addEventListener() 所註冊的事件監聽器。
bubbling
, capturing