先看一張圖(圖片來自網絡,如有侵權聯繫本博主)
這就是一個完整的事件流
DOM(Document Object Model 文檔對象模型),是一個樹型結構。當DOM中某一個HTML元素產生一個事件時,該事件會在該元素結點與DOM的根結點之間按特定的方式進行傳播,也就是說,該條路徑上所經過的所有結點都會收到該事件,這個傳播過程稱之爲DOM事件流。
事件在DOM中傳播的順序有兩種類型:事件捕獲和事件冒泡
冒泡型事件:事件由該結點一直傳播到根結點,一直往上冒。
捕獲型事件:和冒泡型事件剛好相反,它是從根結點一直傳播到該結點,從上到下的一個過程。
標準的事件傳播分爲三個階段:
1)事件捕獲階段
事件沿着DOM數向下傳遞,經歷目標結點的每一個祖先結點,直到目標結點。(如用戶點擊了一個
超鏈接,則該點擊事件將從document結點到html結點,body結點以及包含該鏈接的父親結點)
在此過程中,瀏覽器都會檢測針對該事件的捕獲事件監聽器,並運行該事件監聽器。
2)目標觸發階段
瀏覽器在查找到已經指定給目標元素的事件監聽器後,就會運行該事件監聽器。
3)事件冒泡階段
事件將沿着DOM樹向上傳遞,再次逐個訪問目標元素的祖先結點到document結點。
在此過程中,瀏覽器都會將檢測那些不是捕獲事件監聽器的事件監聽器,並執行它們。
注意:所有的事件都經過捕獲階段和目標階段,但並不是所有的事件都會經過冒泡階段。
例如,讓元素獲得輸入焦點的focus事件以及失去輸入焦點的blur事件就都不會冒泡。
順便解釋下:停止事件冒泡和阻止事件的默認行爲這兩個概念,這兩個概念非常重要,它們對複雜的應用程序處理非常有用。
1.停止事件冒泡
停止事件冒泡是指,停止冒泡型事件的進一步傳遞(取消事件傳遞,不只是停止IE和DOM標準共有的冒泡型事件,我們還可以停止支持DOM標準瀏覽器的捕捉型事件,用topPropagation()方法)。例如上圖中的冒泡型事件傳遞中,在body處理停止事件傳遞後,位於上層的document的事件監聽器就不再收到通知,不再被處理。
2.阻止事件的默認行爲
停止事件的默認行爲是指,通常瀏覽器在事件傳遞並處理完後會執行與該事件關聯的默認動作(如果存在這樣的動作)。例如,如果表單中input type 屬性是 “submit”,點擊後在事件傳播完瀏覽器就自動提交表單。又例如,input 元素的 keydown 事件發生並處理後,瀏覽器默認會將用戶鍵入的字符自動追加到 input 元素的值中。