addEventListener的第三個參數(shù)的作用

從頭說起

如果需要給html中的某個dom綁定事件,有三種常用方法:

1.直接寫在dom的事件鉤子上

<span id="target" onClick="handleClick()">Click me</span>

這種方法破壞了dom和js分離的規(guī)則,所以不太被推薦,如果面試官讓你做題,盡量別這么寫,他們會單純地以為你很low

2.通過js代碼注冊事件

var target = document.getElementById('target');
target.onclick = function() {
  // do something...
}

這種方式會比第一種方式更有“儀式感”,但是缺點(diǎn)也顯而易見,只能綁定一次事件,下次綁定會清空上次綁定的事件

3.通過addEventListener來注冊事件

var target = document.getElementById('target');
target.addEventListener('click', function() {
  // do something...
}, false);    // 如果不加第三個參數(shù),默認(rèn)是false

這種方式最為靈活,也是被普遍建議采用的事件綁定方式,那么問題來了,這第三個參數(shù)是用來干嘛的?

由于瀏覽器有事件冒泡的機(jī)制存在,當(dāng)你點(diǎn)擊一個dom,點(diǎn)擊事件會沿著dom樹結(jié)構(gòu)像上或者下進(jìn)行傳播,如果你不想被其他相關(guān)節(jié)點(diǎn)相應(yīng)到此次點(diǎn)擊事件,那么就需要傳說中的“阻止事件冒泡”了

假設(shè)div、p、span元素都有click事件的響應(yīng)邏輯,

  • 當(dāng)?shù)谌齻€參數(shù)為false時(不傳參數(shù)時,默認(rèn)也是這種冒泡方式),點(diǎn)擊<span />后,接下來<p />會響應(yīng)此次事件,然后是<div />,既事件從上往下冒泡,如下圖
propagation-false.png

當(dāng)?shù)谌齻€參數(shù)為true時,點(diǎn)擊<span />后,首先響應(yīng)事件的是最底層的<div />,隨后是<p />,最后才是你點(diǎn)擊的<span />,如下圖

propagation-true.png

__

其他小貼士

  • 如何分辨事件是由冒泡產(chǎn)生的還是操作產(chǎn)生的?
    在事件處理函數(shù)中,可以通過
function handleClick (evt) {
  if (evt.phase === 1) {
    // 第三個參數(shù)為true時所導(dǎo)致的冒泡
  } else if (evt.phase === 3) {
    // 第三個參數(shù)為false時所導(dǎo)致的冒泡
  } else if (evt.phase === 2) {
    // 發(fā)生在當(dāng)前dom的事件
  }
}
  • 如何阻止事件冒泡?
    在事件處理函數(shù)中,可以通過
function handleClick(evt) {
  evt.stopPropagation();
  // 或者
  evt.stopImmediatePropagation();
}

上面的阻止冒泡不會阻止本dom本事件的其他事件處理函數(shù)的執(zhí)行;
下面的阻止冒泡會導(dǎo)致后續(xù)綁定在該dom的其他事件處理函數(shù)不再執(zhí)行;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,531評論 0 8
  • 以下文章為轉(zhuǎn)載,對理解JavaScript中的事件處理機(jī)制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,175評論 1 10
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,725評論 2 10
  • 第1章 鼠標(biāo)事件 1-1 jQuery鼠標(biāo)事件之click與dbclick事件 用交互操作中,最簡單直接的操作就是...
    mo默22閱讀 1,351評論 0 6
  • 總以為日子總是連環(huán)疊著的,像骨拉多牌一樣,翻了一張還有下一張,青春仿佛除用來荒廢別無他途,日歷本上過一天就圈一點(diǎn),...
    盼盼童鞋閱讀 618評論 2 6

友情鏈接更多精彩內(nèi)容