addEventListener的第三個參數 - 那些前端開發應該要知道的小事(二)

alexianalexian
2019-07-14
那些前端開發應該要知道的小事

前言

開始這個系列的原因,是因為雖然在程式中可能是不影響功能的小事,但卻會關係到整個大系統的流暢度,或是程式碼的簡潔度,這次要提及的是關於javascript與畫面互動最重要的方法,addEventListener,但這次重點不在於元素上有哪些的互動事件(如IE10以後新增的事件transitionend),而是該方法的第三個參數,綁定監聽事件的擴充選項(options)。

根據MDN文件的記載,綁定監聽事件的選項總共有3+1個屬性,分別為capture、once、passive以及mozSystemGroup,本文暫時只收錄前面三項,以下各自介紹其應用情境。

capture

簡單來說,capture屬性能決定同類型事件在巢狀元素的觸發順序,值為true是由最外層元素開始,false則為最內層元素開始,預設值為false,而使用的時機可能會在希望以群組移動元素的時候使用,以下為範例:

HTML:

<div class="block block-1" data-id="block-1">
  <div class="block block-2" data-id="block-2"></div>
</div>

JS:

const blocks = document.querySelectorAll('.block');

function handleClick(e){
  console.log(`data-id: ${this.dataset.id}`)
}
blocks.forEach(block => {
  block.addEventListener('click', handleClick, {
    capture: true,
  })
})

以上程式碼中,當capture為ture時,印出的值會為:

capture result

你可以試試把capture的值更改,看看結果有什麼不同。

once

once,故名思義就是該綁定事件只會觸發一次,其實跟jQuery的.one()方法,在知道這個方法以前,我想許多新手開發者(包括以前的我),都會使用一個開關的變數,或者再使用一個removeEventLisenter方法達到同樣的目的,在知道這選項以後,便不用再這麼麻煩了~

使用範例: HTML:

<div class="block block-1" data-id="block-1">
  <div class="block block-2" data-id="block-2"></div>
</div>

JS:

const blocks = document.querySelectorAll('.block');

function handleClick(e){
 console.log(`this event only trigger once, data-id: ${this.dataset.id}`)
}
blocks.forEach(block => {
  block.addEventListener('click', handleClick, {
   capture: true,
  })
})

passive

相對於前面兩個使用上較常見的選項,passive(在我的經驗上)則較少使用,passive用於避免對象的原生事件被阻止,並且當事件中偵測到使用event.preventDefault()阻止原生事件時,會報錯。 這個選項常用於一些避免網頁無法正常瀏覽的事件類型,例如:scroll,wheel等,以下是使用場景:

function handleScroll(e) {
  e.preventDefault()
  console.log('scrolling')
}

window.addEventListener('scroll', handleScroll, {
  passive: true,
})

當運行以上程式碼時,會報出以下錯誤: error response

使用環境與限制

雖然以上的選項都非常方便,但最重要還是在瀏覽器的相容性能否滿足大部分使用者。可惜的是,目前最新的ie版本也並不支援,不過還是可以使用polyfill來進行向下的相容。

passive 相容性

once 相容性

capture 相容性

以上就是關於addEventListener的第三個參數的介紹,希望大家能夠好好利用這個實用的參數進行開發。


上一篇

閉包 - 那些前端開發應該要知道的小事(三)

下一篇

Debounce & Throttle - 那些前端開發應該要知道的小事(一)


Alex Ian
Alex Ian

ReactJS, VueJS 畫畫/寫作/前端開發

Alex Ian
Alex Ian

ReactJS, VueJS 畫畫/寫作/前端開發


共29篇文章
文章分類
  • 前端開發14
  • JavaScript7
  • 那些前端開發應該要知道的小事5
  • Gatsby.js3
  • ChromeExtension2
  • NetlifyCMS2
  • 生產力工具2
  • 關於我1
  • 非Coding1
  • Svelte1
  • raycast1
  • toolRecommend1
  • productivity1
  • MutationObserver1
  • observer pattern1
  • 開發效率1
  • will-change1
  • GitHubCopilot1
  • 生產力1
  • ChatGPT1
  • AI1
  • Copilot1
  • WebAssembly1
  • SEO1
  • GoogleSearchConsole1
  • react1
  • applescript1
  • 閱讀1
  • css1
  • grid1
  • micro-frontend1

Build with GatsbyJS and React 18.2.0. Hosted on Netlify.

The original code is open source and available at calpa/gatsby-starter-calpa-blog

Copyright ©AlexIan's blog 2025.

  1. 從頭開始上架 Chrome extension

    上回提到我們在本地端建好一個開發版本的 Chrome …
  2. Gatsby 部落格更新記錄 1.0

    首先把 Blog 連結貼在最前面:https://alex-ian.me/ 許多工程師 …
  3. Debounce & Throttle - 那些前端開發應該要知道的小事(一)

    前言 也許一開始接觸前端開發的新手們,都有使 …
  4. 使用 GitHub Copilot 一個月心得

    後悔自己為何沒有早點課金 在 Modern Web Conference 2023 觀後感 …
  5. 什麼是 Headless CMS?以探索 Netlify CMS 為例

    小弟的部落格使用 Gatsby.js 框架來架設,作為一個靜 …
  6. Modern Web Conference 2023 觀後感

    https://modernweb.tw/ 前言 Modern Web Conference (MWC) 作為每年度經典的網頁開 …
  7. 什麼是語法糖(Syntactic sugar)? - 2024 你要知道的 JS 語法糖 🍭

    語法糖能吃嗎? 在算數學時,不知道你什麼時候開 …
  8. 閉包 - 那些前端開發應該要知道的小事(三)

    前言 開始這個系列的原因,是因為雖然在程式中 …
  9. Raycast — Mac 提升工作效率的啟動工具

    Mac 的使用者,應該對 Spotlight 這個系統預設的啟動工具 …
  10. 使用 Notion 管理我的年度目標 暨 2023 回顧 & 2024 展望

    都進入 2024 才來展望 想要成為流量的奴隸,自然要 …
  11. 慢半拍來初嚐 Svelte

    Svelte 都出來兩年多的框架現在才來玩,有夠慢半拍 …
  12. 從頭開始學習開發 Chrome extension (v3 版本)

    Chrome extension 經歷過 v1, v2 後,來到了 v3,雖然曾小量接觸 v2 …
  13. 留言簿

    歡迎留言
  14. addEventListener的第三個參數 - 那些前端開發應該要知道的小事(二)

    前言 開始這個系列的原因,是因為雖然在程式中 …
  15. 在中大型企業下微前端的實現與挑戰

    我們先聊工程面,人的部分先不要 小弟任職前端 …
  16. will-change — 那些前端開發應該要知道的小事(七)

    你要做動畫你要先說啊 前端開發少不免會需要 …
  17. 關於我

    關於我 我是Alex Ian,是個小小的前端工程師,出來工 …
  18. 開發效率提升 - 操作鍵盤 & 快捷鍵篇

    我國中的電腦課,會教導學生倉頡和速成輸入法 …
  19. macbook-pro(retina) late2012 換電池記錄

    這篇文章其實與Coding無關,主要是記錄mbp換電池的 …
  20. polyfill是什麼?

    人在江湖,身不由己,在接案的過程中,總有一些你 …
所有結果