7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

passive: trueとpreventDefaultの備忘録

Last updated at Posted at 2025-01-14

ノベルワークスのとっしー(@tossy)です.

自作webアプリ開発の際に, preventDefaultpassive: true について少し調べたので, 備忘録として保存しておきます.

preventDefault とは?

preventDefaultは, 「規定のアクションを行わないように, ブラウザに伝える為のメソッド」です.

規定のアクションとは, ブラウザや機種ごとに定義されている「特定の操作に対する標準的な挙動(アクション)」を指します. 例えば, 以下のようなものがあります.

  • リンクのクリック → 新しいページへの遷移
  • フォーム送信 → ページのリロードを伴うデータ送信
  • 右クリック → コンテキストメニューの表示
  • スクロール操作 → ページ全体のスクロール

preventDefaultを使うと, この規定のアクションを行われないようにすることが出来ます.
以下はpreventDefaultによってリンクをページ遷移出来ないようにする例です.

const link = document.getElementById('disabled-link');
link.addEventListener('click', (event) => {
    event.preventDefault(); // クリックされた際に, 規定のアクションを無効化!
    alert('このリンクは無効化されています');
});

passive: trueとは?

addEventListener()のオプションの引数であり, 以下のように使用します.

document.addEventListener('wheel', (e) => {
    // 処理
}, { passive: true });

passiveを有効にすると, このイベント内ではpreventDefaultを使用しないことをブラウザに明示します. これにより, ブラウザは処理ごとにpreventDefaultが呼び出されていないかを確認しなくなります.

passive: true にすることによってブラウザはpreventDefaultを確認しないようになりますが, preventDefaultを使用することは出来てしまいます.
preventDefaultを使用した場合は, ブラウザは何もせずコンソールに警告を出します.

passive: true が特に効果を発揮するのは, スクロール時やマウスホイール使用時などです.
例えば, スクロール時はスクロールが少し進むごとにpreventDefaultが呼び出されているかを確認します. これは, preventDefaultが呼び出された場合に即座に規定のアクションを止めるためです.
しかし, preventDefault の呼び出しを常に確認していることで, スクロール時の処理に大きな負荷がかかっています.
負荷の大きさによっては, スクロールがカクつく場合があります. このようなスクロールを「スクロールジャンク」と呼ぶようです.

ここで, preventDefaultを使わない場合は, passive: true をつけることによって, preventDefaultを確認しないようになるので, スムーズにスクロールの改善が期待出来ます.

参考記事

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?