首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

前端基礎

監聽 passive 屬性

By Kurau·2023-03-07·Updated 2026-05-09·2 分鐘閱讀

監聽 passive 屬性

TL;DR
addEventListener('event', handler, { passive: true }) 告訴瀏覽器「這個 listener 不會 呼叫 preventDefault()」 → 瀏覽器可以 不等 JS 執行完 直接滾動 → 滾動更順、不卡頓。

為什麼需要 passive

當你監聽 wheel / touchstart / touchmove 這類滾動相關事件時,瀏覽器不知道你的 listener 會不會呼叫 preventDefault() 來攔截滾動。

所以瀏覽器只能先暫停滾動,等你的 JS 執行完才繼續 —— 這個延遲就是「滾動卡頓」的元凶。

// ❌ 沒加 passive,瀏覽器必須等這個 listener 跑完才滾動
window.addEventListener('wheel', handleWheel);

// ✅ 加 passive,瀏覽器可以平行處理滾動 + JS
window.addEventListener('wheel', handleWheel, { passive: true });
javascript

何時用 / 不用

情境passive
純監聽(分析、追蹤滾動位置)✅ true
需要 e.preventDefault() 阻止預設行為(例:自訂縮放、下拉刷新)❌ false
不確定預設不寫,行為等同 passive: false(較舊瀏覽器)
衝突陷阱
如果在 passive: true 的 listener 裡呼叫 e.preventDefault(),瀏覽器會忽略它 + 在 console 警告: Unable to preventDefault inside passive event listener invocation.

現代瀏覽器的預設行為

Chrome 56+ / Firefox 49+ 起,touchstart 和 touchmove 的 default 已經是 passive: true,除非明確寫 passive: false。wheel 事件預設仍是 non-passive。


實際範例:自訂縮放

需要 preventDefault 才能阻止頁面預設滾動,所以不能用 passive:

canvasEl.addEventListener('wheel', (e) => {
  e.preventDefault();   // 阻止頁面捲動
  zoom(e.deltaY);
}, { passive: false }); // 必須明確設 false
javascript

目錄

    ◆ 相關文章

    • 拖曳事件 (DragEvent)

      2026-05-09
    • 滑鼠滾輪事件 (WheelEvent)

      2026-05-09
    • iframe 嵌入

      2026-05-09
    • SCSS 編譯 前綴問題

      2026-05-09
    ← 上一篇拖曳事件 (DragEvent)下一篇 →免費伺服器 介紹

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章