#每日一記#通過 GIF 理解 addEventListener冈欢、捕獲和冒泡

每日一記 - 但并不日更

回想起自己學習事件模式那會兒歉铝,怎么都記不住事件的傳播流程和 addEventListener 的設置細節(jié),后來發(fā)現(xiàn)好的圖片更能能幫助我們理解邏凑耻,所以做了一個 GIF太示。

事件傳播模式

假設我們現(xiàn)在有三個DOM節(jié)點,并且假設 div 為根節(jié)點香浩。(通常事件的捕獲會從根節(jié)點開始)

div -> p -> span

然后我們?yōu)檫@些DOM節(jié)點設置好監(jiān)聽类缤。

// 設置第三個參數(shù)為 true 則在捕獲階段觸發(fā)
div.addEventListener('click', null, true);
p.addEventListener('click', null, true);
span.addEventListener('click', null, true);

span.addEventListener('click', null);
p.addEventListener('click', null);
div.addEventListener('click', null);

現(xiàn)在我們點擊span,那么click事件會被觸發(fā)邻吭,事件會從div進入捕獲階段餐弱,從父級向子級傳遞,到達事件目標后進入冒泡階段,從子級像父級傳遞膏蚓。

(click)span
=> div -> p -> span -> span -> p -> div

普通流程

如果我們點擊p瓢谢,那么事件目標為p元素,事件從div元素開始捕獲驮瞧,并從p元素處折返變?yōu)槊芭荨?/p>

(click)p
=> div -> p -> p -> div

普通流程

多次綁定

如果在一個節(jié)點上多次綁定同一個事件的監(jiān)聽氓扛,它們會按照事件傳播流程進行(先捕獲后冒泡),如果所處流程一樣則按照先綁定先觸發(fā)的原則论笔。

// 設置第三個參數(shù)為 true 則在捕獲階段觸發(fā)
div.addEventListener('click', null, true) // #1
div.addEventListener('click', null)       // #2
div.addEventListener('click', null, true) // #3

p.addEventListener('click', null, true);
p.addEventListener('click', null);

(click)p
=> div#1 -> div#3 -> p -> p -> div#2

多次綁定

雖然申明的順序是div#1 div#2 div#3采郎,但是捕獲先于冒泡,所以 div#1 div#3依次觸發(fā)狂魔,而div#2在冒泡過程中觸發(fā)蒜埋。

stopPropagation

這是Event對象的一個方法,用來阻止事件進一步傳播最楷。

// 設置第三個參數(shù)為 true 則在捕獲階段觸發(fā)
// #1
div.addEventListener('click', function (event) {
  event.stopPropagation();
}, true) 
div.addEventListener('click', null)       // #2
div.addEventListener('click', null, true) // #3

p.addEventListener('click', null, true);
p.addEventListener('click', null);

(click)p
=> div#1 -> div#3

stopPropagation

使用了stopPropagation()之后整份,事件就不能進一步傳播了,即使是在div上籽孙,捕獲和冒泡被認為是兩個步驟皂林,所以在捕獲階段傳播被阻止時同節(jié)點上的冒泡也不會觸發(fā)。

stopImmediatePropagation

這是Event對象的一個方法蚯撩,一旦調用這個方法,則該元素上未觸發(fā)的監(jiān)聽都不會被觸發(fā)烛占,事件也不會進一步傳播胎挎。

現(xiàn)在我們在div上再多增加一個事件監(jiān)聽,并把stopImmediatePropagation添加在捕獲事件中第二個觸發(fā)的監(jiān)聽上忆家。

// 設置第三個參數(shù)為 true 則在捕獲階段觸發(fā)
div.addEventListener('click', null, true) // #1
div.addEventListener('click', null)       // #2
// #3
div.addEventListener('click', function (e) {
  e. stopImmediatePropagation();
}, true)
div.addEventListener('click', null, true) // #4

p.addEventListener('click', null, true);
p.addEventListener('click', null);

(click)p
=> div#1 -> div#3

stopImmediatePropagation

使用了stopImmediatePropagation()之后犹菇,連當前節(jié)點中等待觸發(fā)的監(jiān)聽都沉默了。

擴展閱讀

在比較新的瀏覽器中芽卿,addEventListener支持更多參數(shù)配置揭芍,第三個參數(shù)類型支持object

target.addEventListener(type, listener[, options]);

這個 options 支持三個字段

  • capture Boolean 是否在捕獲模式觸發(fā)
  • once Boolean 是否僅觸發(fā)一次
  • passive Boolean 是否使用被動模式

這里展示一下once的效果

// 設置第三個參數(shù)為 true 則在捕獲階段觸發(fā)
div.addEventListener('click', null, true);
p.addEventListener('click', null, true);
span.addEventListener('click', null, true);

span.addEventListener('click', null);
p.addEventListener('click', null, {once: true}); // 在冒泡階段只觸發(fā)一次
div.addEventListener('click', null);

(click)span
=> div -> p -> span -> span -> p -> div

(click)span
=> div -> p -> span -> span -> div

once

Demo

JSbin

羅小黑寫寫文字

如果喜歡文章 請留下一個贊~
如果喜歡文章 分享給更多人~

掘金中關注我
簡書中關注我

自由轉載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證
轉載時請保留原文鏈接 以保證可及時獲取對文章的訂正和修改

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末卸例,一起剝皮案震驚了整個濱河市称杨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筷转,老刑警劉巖姑原,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呜舒,居然都是意外死亡锭汛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唤殴,“玉大人般婆,你說我怎么就攤上這事《涫牛” “怎么了蔚袍?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長廉侧。 經(jīng)常有香客問我页响,道長,這世上最難降的妖魔是什么段誊? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任闰蚕,我火速辦了婚禮,結果婚禮上连舍,老公的妹妹穿的比我還像新娘没陡。我一直安慰自己,他們只是感情好索赏,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布盼玄。 她就那樣靜靜地躺著,像睡著了一般潜腻。 火紅的嫁衣襯著肌膚如雪埃儿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天融涣,我揣著相機與錄音童番,去河邊找鬼。 笑死威鹿,一個胖子當著我的面吹牛剃斧,可吹牛的內容都是我干的。 我是一名探鬼主播忽你,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼幼东,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了科雳?” 一聲冷哼從身側響起根蟹,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糟秘,沒想到半個月后娜亿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蚌堵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年买决,在試婚紗的時候發(fā)現(xiàn)自己被綠了沛婴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡督赤,死狀恐怖嘁灯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情躲舌,我是刑警寧澤丑婿,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站没卸,受9級特大地震影響羹奉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜约计,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一诀拭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煤蚌,春花似錦耕挨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜘犁,卻和暖如春翰苫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背这橙。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工革骨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人析恋。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像盛卡,于是被迫代替她去往敵國和親助隧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件滓技,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,477評論 1 11
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學習筆記整理一下(...
    angryyan閱讀 6,974評論 1 6
  • 事件是一種異步編程的實現(xiàn)方式,本質上是程序各個組成部分之間的通信令漂。DOM支持大量的事件膝昆,本節(jié)介紹DOM的事件編程丸边。...
    許先生__閱讀 933評論 0 3
  • 事件是一種異步編程的實現(xiàn)方式,本質上是程序各個組成部分之間的通信荚孵。DOM支持大量的事件妹窖,本節(jié)介紹DOM的事件編程。...
    周花花啊閱讀 593評論 0 3
  • js之事件機制 1收叶、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驅動...
    道無虛閱讀 2,343評論 1 3