0Pricing
jQuery Academy · レッスン

イベント伝播の停止

.stopPropagation()と.preventDefault()を理解し、イベントの流れを制御してブラウザーのデフォルト動作を防ぎ、複雑なイベントの相互作用を効果的に管理します。

「イベント伝播の停止」はCoddyKit上の無料jQuery Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはjQuery Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 jQuery Academyコースには全3レッスンが含まれています。

イベントを制御しましょう

クリックやフォーム送信などのイベントは、1つの要素だけで発生するとは限りません。多くの場合、Document Object Model(DOM)を通って伝わります。

この流れを制御する方法を学ぶことは、正確でインタラクティブなWebページを構築するうえで重要です。

デフォルト動作を防止する

ブラウザーには、多くのHTML要素に対してデフォルト動作が設定されています。たとえば、次のような動作です。

  • <a>タグをクリックすると、新しいページに移動します。
  • <form>を送信すると、ページが再読み込みされます。

event.preventDefault()を使うと、これらのブラウザー組み込みの動作を停止できます。

`preventDefault()`の動作

下のリンクをクリックしてみてください。通常はexample.comに移動しますが、.preventDefault()によって移動が停止されます。

<!DOCTYPE html>
<html>
<head>
<title>Prevent Default</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
  <h1>Prevent Default Example</h1>
  <a href="https://example.com" id="myLink">Click Me! (Should not navigate)</a>
  <div id="output"></div>

  <script>
  $(document).ready(function() {
    $('#myLink').on('click', function(event) {
      event.preventDefault(); // Stop the link from navigating
      $('#output').append('<p>Link click prevented! You\'re still here.</p>');
    });
  });
  </script>
</body>
</html>

イベントバブリングを理解する

要素上でイベント(クリックなど)が発生すると、その要素のハンドラーだけが実行されるわけではありません。DOMツリーを上に向かって「バブルアップ」します。

  • まず、その要素の親要素にあるハンドラーが実行されます。
  • 次に、親の親要素にあるハンドラーが実行されます。
  • その後も同様に、<body>や<html>に到達するまで続きます。

この上方向への伝播をイベントバブリングと呼びます。

バブルを止める:`stopPropagation()`

イベントが発生元の要素だけ、または特定の親要素だけで処理され、それより上位の要素に影響しないようにしたい場合があります。

このようなときに使うのがevent.stopPropagation()です。これにより、イベントがDOMツリーをさらに上へバブリングするのを停止できます。

`stopPropagation()`の例

内側のボックスをクリックしてください。stopPropagation()がない場合は両方のメッセージが表示されます。これを使うとバブリングが停止するため、内側のボックスのメッセージだけが表示されます。

<!DOCTYPE html>
<html>
<head>
<title>Stop Propagation</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
  #outer {
    padding: 20px;
    background-color: lightblue;
    border: 1px solid blue;
    margin: 10px;
  }
  #inner {
    padding: 20px;
    background-color: lightcoral;
    border: 1px solid red;
    margin-top: 10px;
  }
</style>
</head>
<body>
  <h1>Stop Propagation Example</h1>
  <div id="outer">
    Outer Div (Click me!)
    <div id="inner">
      Inner Div (Click me!)
    </div>
  </div>
  <div id="log"></div>

  <script>
  $(document).ready(function() {
    $('#outer').on('click', function() {
      $('#log').append('<p>Outer Div clicked!</p>');
    });

    $('#inner').on('click', function(event) {
      event.stopPropagation(); // Stop bubbling here
      $('#log').append('<p>Inner Div clicked!</p>');
    });
  });
  </script>
</body>
</html>

バブリングを停止する実用例

stopPropagation()は、次のような場面で役立ちます。

  • モーダルダイアログ:オーバーレイのクリックを発生させて、モーダル内部のクリックでモーダルが閉じるのを防ぎます。
  • 入れ子になったドロップダウン:親要素がクリックされたときに、子ドロップダウンが開いたままになるようにします。
  • 複雑なUIコンポーネント:特定のコンポーネント用のイベントハンドラーがグローバルリスナーに干渉しないようにします。

イベントオブジェクト

.preventDefault()と.stopPropagation()は、どちらもイベントオブジェクトのメソッドです。このオブジェクトは、イベントハンドラー関数の引数として渡されます。

イベントオブジェクトには、発生したイベントの種類、対象要素、マウス座標など、イベントに関するさまざまな有用な情報が含まれています。

<!DOCTYPE html>
<html>
<head>
<title>Event Object</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
  <h1>Event Object Properties</h1>
  <button id="myButton">Click Me</button>
  <div id="output"></div>

  <script>
  $(document).ready(function() {
    $('#myButton').on('click', function(event) {
      $('#output').empty(); // Clear previous output
      $('#output').append('<p>Event Type: <code>' + event.type + '</code></p>');
      $('#output').append('<p>Target Element ID: <code>' + event.target.id + '</code></p>');
      $('#output').append('<p>Mouse X Position: <code>' + event.pageX + '</code></p>');
      $('#output').append('<p>Mouse Y Position: <code>' + event.pageY + '</code></p>');
    });
  });
  </script>
</body>
</html>

2つのメソッドを組み合わせる

.preventDefault()と.stopPropagation()の両方が必要になる場合があります。これらは異なる問題を解決します。

  • .preventDefault():ブラウザーのデフォルト動作を停止します。
  • .stopPropagation():イベントがDOMを上方向へ伝播するのを停止します。

たとえば、複雑なコンポーネント内のボタンで、デフォルトのクリック動作を防止すると同時に、そのクリックによって親要素のハンドラーが実行されるのを防ぐ必要がある場合があります。

イベント制御を理解する

divの<div id="container">内に、リンク<a href="#" id="link">があるとします。リンクによる移動を防止し、さらにクリックイベントが#container上のハンドラーを実行しないようにしたいとします。

復習:イベント制御

よくできました。イベントの流れを制御する方法を身につけました。

  • .preventDefault():イベントに対するブラウザーのデフォルト動作(リンクの移動やフォーム送信など)を停止します。
  • .stopPropagation():イベントがDOMツリーを上へバブリングして親要素に到達するのを防ぎます。

これらの強力なメソッドを使うと、Webアプリケーション内でのイベントの動作を正確に制御でき、より予測しやすく堅牢なユーザー体験につながります。

よくある質問

「イベント伝播の停止」レッスンは無料ですか?

はい。「イベント伝播の停止」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、jQuery Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 jQuery Academyコースには全3レッスンが含まれています。

「イベント伝播の停止」で何を学びますか?

.stopPropagation()と.preventDefault()を理解し、イベントの流れを制御してブラウザーのデフォルト動作を防ぎ、複雑なイベントの相互作用を効果的に管理します。 ブラウザで直接実行するハンズオンコードでjQuery Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

jQuery Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのjQuery Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「イベント伝播の停止」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このjQuery Academyレッスンでコードを書いて実行できますか?

はい。すべてのjQuery Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 堅牢なイベントデリゲーションの実装
  2. イベント伝播の停止
  3. カスタムイベントの作成と発火
← jQuery Academyに戻る