理解DOM事件流的三個階段


流的概念,在現今的JavaScript中隨處可見。比如說React中的單向數據流,Node中的流,又或是今天本文所講的DOM事件流,都是流的一種生動體現。用術語說流是對輸入輸出設備的抽象。以程序的角度說,流是具有方向的數據。事件流所描述的就是從頁面中接受事件的順序。事件流也有兩種,分別是事件冒泡和事件捕獲。

 在所有的現代瀏覽器當中——除了IE9之前的版本——都實現了DOM2標准事件模型,即事件處理過程的三個階段:捕獲,目標,冒泡;

(1)捕獲階段:當我們在 DOM 樹的某個節點發生了一些操作(例如單擊、鼠標移動上去),就會有一個事件發射過去。這個事件從 Window 發出,不斷經過下級節點直到觸發的目標節點。在到達目標節點之前的過程,就是捕獲階段(Capture Phase)。(所有經過的節點,都會觸發這個事件。捕獲階段的任務就是建立這個事件傳遞路線,以便后面冒泡階段順着這條路線返回 Window。)在目標元素對象本身上注冊的捕獲事件處理程序不會被調用。
(2)目標階段:當事件不斷的傳遞直到目標節點的時候,最終在目標節點上觸發這個事件,就是目標階段。
(3)冒泡階段:事件冒泡即事件開始時,由最具體的元素接收(也就是事件發生所在的節點),然后逐級傳播到較為不具體的節點(我們平時用的事件綁定就是利用的事件冒泡的原理)

事件冒泡即事件開始時,由最具體的元素接收(也就是事件發生所在的節點),然后逐級傳播到較為不具體的節點。

事件捕獲的概念,與事件冒泡正好相反。它認為當某個事件發生時,父元素應該更早接收到事件,具體元素則最后接收到事件

事件一開始從文檔的根節點流向目標對象(捕獲階段),然后在目標對向上被觸發(目標階段),之后再回溯到文檔的根節點(冒泡階段)。

事件冒泡過程,是可以被阻止的。防止事件冒泡而帶來不必要的錯誤和困擾。

這個方法就是:stopPropagation()

stopPropagation() 方法:終止事件在傳播過程的捕獲、目標處理或起泡階段進一步傳播。調用該方法后,該節點上處理該事件的處理程序將被調用,事件不再被分派到其他節點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM