摘要:本文主要解決兩個問題什么是事件流事件流的三個階段起因在學習前端的大半年來,對事件了解甚少。事件流所描述的就是從頁面中接受事件的順序。事件流事件流包括三個階段。防止事件冒泡而帶來不必要的錯誤和困擾。分有事件冒泡與事件捕獲兩種。
本文主要解決兩個問題:
什么是事件流
DOM事件流的三個階段
起因在學習前端的大半年來,對DOM事件了解甚少。一般也只是用用onclick來綁定個點擊事件。在寒假深入學習JavaScript時,愈發覺得自己對DOM事件了解不夠,遂打開我的《JavaScript高級程序設計》,翻到DOM事件那一章,開始第二次學習之旅。
當然,DOM事件所囊括的知識較為龐雜,所以本文專注與自己學習時所碰到的難點,DOM事件流。
流的概念,在現今的JavaScript中隨處可見。比如說React中的單向數據流,Node中的流,又或是今天本文所講的DOM事件流。都是流的一種生動體現。
至于流的具體概念,我們采用下文的解釋:
事件流之事件冒泡與事件捕獲用術語說流是對輸入輸出設備的抽象。以程序的角度說,流是具有方向的數據。
通通連起來——無處不在的流 淘寶FED--愈之
在瀏覽器發展的過程中,開發團隊遇到了一個問題。那就是頁面中的哪一部分擁有特定的事件?
可以想象畫在一張紙上的一組同心圓,如果你把手指放在圓心上,那么你的手指指向的其實不是一個圓,而是紙上所有的圓。放到實際頁面中就是,你點擊一個按鈕,事實上你還同時點擊了按鈕所有的父元素。
開發團隊的問題就在于,當點擊按鈕時,是按鈕最外層的父元素先收到事件并執行,還是具體元素先收到事件并執行?所以這兒引入了事件流的概念。
事件流所描述的就是從頁面中接受事件的順序。
因為有兩種觀點,所以事件流也有兩種,分別是事件冒泡和事件捕獲。現行的主流是事件冒泡。
事件冒泡事件冒泡即事件開始時,由最具體的元素接收(也就是事件發生所在的節點),然后逐級傳播到較為不具體的節點。
舉個栗子,就很容易明白了。
Event Bubbling
然后,我們給button和它的父元素,加入點擊事件。
var button = document.getElementById("clickMe"); button.onclick = function() { console.log("1. You click Button"); }; document.body.onclick = function() { console.log("2. You click body"); }; document.onclick = function() { console.log("3. You click document"); }; window.onclick = function() { console.log("4. You click window"); };
效果如圖所示:
在代碼所示的頁面中,如果點擊了button,那么這個點擊事件會按如下的順序傳播(Chrome瀏覽器):
button
body
document
window
也就是說,click事件首先在元素上發生,然后逐級向上傳播。這就是事件冒泡。
事件捕獲事件捕獲的概念,與事件冒泡正好相反。它認為當某個事件發生時,父元素應該更早接收到事件,具體元素則最后接收到事件。比如說剛才的demo,如果是事件捕獲的話,事件發生順序會是這樣的:
window
document
body
button
當然,由于時代更迭,事件冒泡方式更勝一籌。所以放心的使用事件冒泡,有特殊需要再使用事件捕獲即可。
DOM事件流包括三個階段。
事件捕獲階段
處于目標階段
事件冒泡階段
如圖所示(圖片源于網絡,若侵權請告知):
也就是說,當事件發生時,首先發生的是事件捕獲,為父元素截獲事件提供了機會。
例如,我把上面的Demo中,window點擊事件更改為使用事件捕獲模式。(addEventListener最后一個參數,為true則代表使用事件捕獲模式,false則表示使用事件冒泡模式。不理解的可以去學習一下addEventListener函數的使用)
window.addEventListener("click", function() { console.log("4. You click window"); }, true);
此時,點擊button的效果是這樣的。
可以看到,點擊事件先被父元素截獲了,且該函數只在事件捕獲階段起作用。
處于目標與事件冒泡階段事件到了具體元素時,在具體元素上發生,并且被看成冒泡階段的一部分。
隨后,冒泡階段發生,事件開始冒泡。
事件冒泡過程,是可以被阻止的。防止事件冒泡而帶來不必要的錯誤和困擾。
這個方法就是:stopPropagation()
我們對button的click事件做一些改造。
button.addEventListener("click", function(event) { // event為事件對象 console.log("1. You click Button"); event.stopPropagation(); console.log("Stop Propagation!"); }, false);
點擊后,效果如下圖:
不難看出,事件在到達具體元素后,停止了冒泡。但不影響父元素的事件捕獲。
總結與感想事件流:描述的就是從頁面中接受事件的順序。分有事件冒泡與事件捕獲兩種。
DOM事件流的三個階段:
事件捕獲階段
處于目標階段
事件冒泡階段
在學習DOM事件的過程中,了解了DOM事件的三個階段,也知道事件冒泡是干啥用的,又如何阻止。配合前期所學的二叉樹的相關知識,受益匪淺。
前端路漫漫,且行且歌~
最后附上本人博客地址和原文鏈接,希望能與各位多多交流。
Lxxyx的前端樂園
原文鏈接:寒假前端學習(10)——理解DOM事件流的三個階段
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78714.html
摘要:本文主要解決兩個問題什么是事件流事件流的三個階段起因在學習前端的大半年來,對事件了解甚少。事件流所描述的就是從頁面中接受事件的順序。事件流事件流包括三個階段。防止事件冒泡而帶來不必要的錯誤和困擾。分有事件冒泡與事件捕獲兩種。 本文主要解決兩個問題: 什么是事件流 DOM事件流的三個階段 起因 在學習前端的大半年來,對DOM事件了解甚少。一般也只是用用onclick來綁定個點擊事件。...
摘要:事件流是事件冒泡,而的事件流就是事件捕獲。所有現代瀏覽器都支持事件冒泡,并且會將事件一直冒泡到對象。事件捕獲的用以在于事件到達預定目標之前捕獲它。事件流級事件規定事件流包括三個階段,事件捕獲階段處于目標階段和事件冒泡階段。 最近在復習前端的基礎,看到事件這一節的時候,剛好發現了筆記中一道特別好玩并且十分有趣的代碼,根據這么一道題目,基本上能夠把事件冒泡和事件捕獲的盲區給掃空。本文就帶你...
摘要:事件流是事件冒泡,而的事件流就是事件捕獲。所有現代瀏覽器都支持事件冒泡,并且會將事件一直冒泡到對象。事件捕獲的用以在于事件到達預定目標之前捕獲它。事件流級事件規定事件流包括三個階段,事件捕獲階段處于目標階段和事件冒泡階段。 最近在復習前端的基礎,看到事件這一節的時候,剛好發現了筆記中一道特別好玩并且十分有趣的代碼,根據這么一道題目,基本上能夠把事件冒泡和事件捕獲的盲區給掃空。本文就帶你...
摘要:事件流是事件冒泡,而的事件流就是事件捕獲。所有現代瀏覽器都支持事件冒泡,并且會將事件一直冒泡到對象。事件捕獲的用以在于事件到達預定目標之前捕獲它。事件流級事件規定事件流包括三個階段,事件捕獲階段處于目標階段和事件冒泡階段。 最近在復習前端的基礎,看到事件這一節的時候,剛好發現了筆記中一道特別好玩并且十分有趣的代碼,根據這么一道題目,基本上能夠把事件冒泡和事件捕獲的盲區給掃空。本文就帶你...
閱讀 2789·2021-11-24 09:39
閱讀 2548·2021-11-23 09:51
閱讀 1802·2021-11-17 09:33
閱讀 1737·2021-10-22 09:54
閱讀 1871·2021-08-16 11:00
閱讀 3421·2019-08-30 15:53
閱讀 1733·2019-08-30 13:19
閱讀 2902·2019-08-30 12:49