[note] Event Capturing and Bubbling
tags: event, propagation, capturing, bubbling
本篇非原創,內容整理自 :thumbsup: Bubbling and Capturing @ JavaScript.info。
冒泡事件(Bubbling)
冒泡(Bubbling):當一個元素被觸發時,在它身上事件處理器(event handler)會先執行,接著是它的父層元素,然後是所有其它的上層元素 也都會被觸發。
舉例來說,當 <p> 被點擊時,<p> 的事件處理器會先被觸發,接著依序是 <div> 然後是 <form>:
<!--
Event Bubbling: <p> -> <div> -> <form>
-->
<form onclick="alert('form')">
FORM
<div onclick="alert('div')">
DIV
<p onclick="alert('p')">P</p>
</div>
</form>
幾乎所有的事件都是冒泡事件,除了少數事件不是,如
focus等。

因此最上層的元素幾乎可以知道內層元素所有發生的事情,其中包含幾個重要的屬性:
event.target:觸發此事件的元素可以透過event.target來取得,這個元素在整個冒泡過程中不會改變。event.currentTarget:綁定此事件的元素,通常和this指的是同一個元素。this:指的是處理此事件的元素,和event.currentTarget指稱同一個元素。
停止冒泡
冒泡事件會從被觸發該事件的 target element 一直上外傳遞,基本上會一直到 <html> 然後到 document 物件,有些事件甚至會到 window。
event.stopPropagation():在冒泡的過程中,任何事件處理器都能夠決定要不要終止繼續向外冒泡,只需使用event.stopPropagation()即可。event.stopImmediatePropagation():如果一個元素被綁了一個以上的事件處理器時,此時其中一個事件雖然使用event.stopPropagation()來停止向外冒泡,但這個元素上的其他的事件處理器仍然會執行,此時可以使用event.stopImmediatePropagation()來停止這個元素繼續冒泡,並避免這個元素上的其他事件處理器被執行。
stopPropagation()會讓相同元素的其他 handlers 被執行,但是stopImmediatePropagation()則會避免相同元素的其他事件再次被觸發。
要留意的是,除非有需要,否則不需要停止冒泡事件