了解JavaScript中的事件冒泡和事件捕獲的工作原理
冒泡和捕獲是DOM事件用於傳播的兩種模型。
假設您的DOM結構如下:
<div id="container">
<button>Click me</button>
</div>
您希望在用戶點擊“button”時進行跟踪,並且有兩個事件監聽器,一個在button上,另一個在#container
上。
請記住,除非您停止事件的傳播(參見後面的內容),否則對子元素的點擊事件將始終傳播到其父元素。
這些事件監聽器將按照順序調用,並且該順序由事件的冒泡/捕獲模型決定。
冒泡意味著事件從被點擊的項目(子項)向上傳播到其所有父層樹,從最近的父層開始。
在我們的示例中,button
上的處理程序將在#container
上的處理程序之前觸發。
捕獲則相反:外部事件處理程序在更具體的處理程序(例如button
上的處理程序)之前觸發。
默認情況下,所有事件都會冒泡。
您可以通過將第三個參數應用於addEventListener
並將其設置為true
來選擇採用事件捕獲:
document.getElementById('container').addEventListener(
'click',
() => {
//window loaded
},
true
)
請注意,首先運行所有捕獲事件處理程序,然後運行所有冒泡事件處理程序。
順序遵循以下原則:DOM從Window對象開始,遍歷所有元素並尋找被點擊的項目。在此過程中,調用與事件關聯的任何事件處理程序(捕獲階段)。
一旦到達目標,它然後從父層樹重複此過程,直到Window對象,再次調用事件處理程序(冒泡階段)。