關(guān)于JavaScript的addEventListener第三個(gè)參數(shù)的注記

Mozilla瀏覽器提供了一個(gè)JavaScript的綁定事件監(jiān)聽器的函數(shù)addEventListener

document.getElementById("button1").addEventListener("click",callback,isCapture);

其中各個(gè)參數(shù)說明如下:

  • "click" 代表注冊(cè)的什么事件。“click”代表的自然是點(diǎn)擊事件,注意前面不加“on”前綴。也可以是其他事件,去掉“on”前綴即可。
  • callback 回調(diào)函數(shù),當(dāng)事件被觸發(fā)時(shí)調(diào)用該函數(shù)。
  • isCapture 是否在捕獲階段執(zhí)行回調(diào)。默認(rèn)為false。

下面來說一下第三個(gè)參數(shù) isCapture。它是一個(gè)boolean類型的值。說到它就不得不提一下JavaScript中的事件觸發(fā)經(jīng)歷的兩個(gè)階段:捕獲階段和冒泡階段。

事件觸發(fā)經(jīng)歷的兩個(gè)階段

從圖中可見都是嵌套關(guān)系。我們假定點(diǎn)擊了最內(nèi)層的text元素,觸發(fā)了它的onclick事件。
但是實(shí)際上因?yàn)槭乔短椎脑颍c(diǎn)擊了最內(nèi)層的text也相當(dāng)于點(diǎn)擊了它的父元素div,也相當(dāng)于點(diǎn)擊了父元素的父元素body……也相當(dāng)于點(diǎn)擊了window,那么如果這些外層元素也有onclick的點(diǎn)擊事件,它們也應(yīng)當(dāng)被觸發(fā),現(xiàn)在的問題是,是在什么時(shí)候被觸發(fā)?
圖中可見有兩個(gè)階段

  1. 先從最外面開始(也就是window開始)向內(nèi)推進(jìn),直到定位到觸發(fā)的元素text。這一過程叫“捕獲過程”。
  2. 然后從該元素開始,又向上級(jí)冒泡。該過程為“冒泡過程”。

顯然,對(duì)于這個(gè)嵌套鏈上的每個(gè)元素,它的觸發(fā)按數(shù)即可以在捕獲階段被執(zhí)行,也可以在冒泡階段被執(zhí)行。

所以,addEventListener的第三個(gè)參數(shù)正是指定這個(gè)觸發(fā)時(shí)段的。默認(rèn)情況是false,也就是在冒泡階段被執(zhí)行;如果指派為true,則在捕獲階段被執(zhí)行。


用一個(gè)簡(jiǎn)單的實(shí)驗(yàn)可以說明問題:
假設(shè)現(xiàn)在一個(gè)HTML界面有三個(gè)呈嵌套關(guān)系的元素

 <div id="outer" >
    <div id="middle" >
      <input type="button" id="inner" value="inner"/>
    </div>
 </div>

最外層是outer,中間是middle,內(nèi)部是inner。
下面是三個(gè)元素綁定點(diǎn)擊事件:

window.onload=function(){ 
    document.getElementById("inner").addEventListener("click",show("inner"),false); 
    document.getElementById("middle").addEventListener("click",show("middle"),false); 
    document.getElementById("outer").addEventListener("click",show("outer"),false); 
} 
function show(i){ 
    return function(){
        console.log(i);
    }
} 

點(diǎn)擊對(duì)應(yīng)元素,就會(huì)在控制臺(tái)打印出相應(yīng)信息。下面分別修改三個(gè)boolean參數(shù),觀察輸出結(jié)果

輸出結(jié)果

OUTPUT的結(jié)果左邊先打印,右邊后打印。我們舉兩個(gè)結(jié)果說明:

  • isCapture分別被設(shè)置為TFF的時(shí)候,點(diǎn)擊最內(nèi)層inner的按鈕,由于outer、middle設(shè)置的為false,那么它們?cè)诓东@階段不會(huì)被觸發(fā),控制流到達(dá)inner,此時(shí)先輸出inner,然后開始返回,也就是向上級(jí)冒泡,所以依次觸發(fā)middle、outer。
  • isCapture分別被設(shè)置為TTF的時(shí)候,點(diǎn)擊最內(nèi)層inner按鈕,由于outer設(shè)置為false,那么它在進(jìn)入的階段不會(huì)被觸發(fā),但是當(dāng)遇到middle時(shí)候,因?yàn)槭莟rue,所以會(huì)被觸發(fā),先輸出middle,然后輸出inner,最后在返回的冒泡階段,outer被觸發(fā),最后輸出outer。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,416評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,597評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,029評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,403評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,746評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • 前言:之前的上傳圖片用到了event.target,但是后來仔細(xì)思考了一下,自己對(duì)event.target,thi...
    Ruby君閱讀 2,017評(píng)論 1 3
  • 如何批量操作 css 如何獲取 DOM 計(jì)算后的樣式 使用getComputedStyle獲取元素計(jì)算后的樣式 實(shí)...
    _Dot912閱讀 573評(píng)論 1 3
  • 事件流 定義:1.事件流描述的是從頁面中接收事件的順序,也可理解為事件在頁面中傳播的順序。2.事件就是用戶或?yàn)g覽器...
    murphywuwu閱讀 463評(píng)論 4 4
  • 1、事件傳播機(jī)制、阻止傳播、取消默認(rèn)事件、事件代理這些到底是什么呢? ①事件傳播機(jī)制:JS事件傳播包括三個(gè)階段: ...
    海山城閱讀 294評(píng)論 0 0
  • 忘了珍惜 歲月總是催人老,又催人離開,繁忙也總是讓你忘卻一個(gè)人都會(huì)面臨的生死離別,一切都來得特別突然又那么的不真切...
    蒙氏愛豆閱讀 401評(píng)論 0 0