イベントの伝播

JS

JavaScriptのイベントの伝播について

event.stopPropagation()

<!DOCTYPE html>
<html>
<head>
  <title>Event Propagation Example</title>
</head>
<body>
  <div id="parent" style="width: 200px; height: 200px; background-color: lightblue;">
    Parent Div
    <button id="child">Child Button</button>
  </div>

  <script>
    document.getElementById('parent').addEventListener('click', function() {
      alert('Parent Div clicked!');
    });

    document.getElementById('child').addEventListener('click', function(event) {
      alert('Child Button clicked!');
      event.stopPropagation(); // 親のイベントリスナーには伝播しない
    });
  </script>
</body>
</html>

この例で言うと、

event.stopPropagation();を消すと、

イベントが親にも伝播して

alert(‘Child Button clicked!’);が2回表示されます。

よって、親にイベントが伝播しないようにevent.stopPropagation();を書きます。

event.stopImmediatePropagation()

<!DOCTYPE html>
<html>
<head>
  <title>Double Click Example</title>
</head>
<body>
  <button id="button">Click me</button>

  <script>
    document.getElementById('button').addEventListener('click', function(event) {
      alert('Single click!');
    });

    document.getElementById('button').addEventListener('dblclick', function(event) {
      alert('Double click!');
      event.stopImmediatePropagation(); // 他のイベントリスナーには伝播しない
    });
  </script>
</body>
</html>

この例では、ボタンをダブルクリックすると、「Double click!」というアラートが表示されますが、

シングルクリック時のイベントは発生しません。

event.stopPropagation()との違いは、

event.stopPropagation()は同じ要素への残りのイベントハンドラは実行されますが、

stopImmediatePropagation()は同じ要素への残りのイベントハンドラの実行も止めます。親要素へのイベントの伝播も止まります。

event.preventDefault()

<!DOCTYPE html>
<html>
<head>
  <title>Event Default Action Example</title>
</head>
<body>
  <a href="https://www.example.com" id="link">Go to Example.com</a>

  <script>
    document.getElementById('link').addEventListener('click', function(event) {
      alert('Link clicked!');
      event.preventDefault(); // デフォルトの動作(リンク先に移動する)をキャンセル
    });
  </script>
</body>
</html>

event.preventDefault()はデフォルトの動作をキャンセルするので、

aタグを押してもリンクされず、アラートが表示されます。