Zum Inhalt springen

JavaScript-Ereignis-Bubbling und Capturing

Event-Bubbling und Capturing in JavaScript meistern

Event Bubbling und Capturing sind zwei Phasen im Ereignis-Propagationsmodell, das auftritt, wenn Ereignisse im Document Object Model (DOM) ausgelöst werden. Das Verständnis dieser Konzepte ist entscheidend, um Ereignisse in komplexen Webanwendungen effektiv zu behandeln. Dieser Leitfaden erklärt diese Konzepte und bietet praktische Beispiele, um zu zeigen, wie sie funktionieren.


Event Bubbling und Capturing verstehen

Ereignis-Propagation

Die Ereignis-Propagation im DOM erfolgt in drei Phasen:

  1. Capturing-Phase: Das Ereignis beginnt oben im DOM-Baum (Dokumentobjekt) und wird nach unten zum Zielelement weitergeleitet.
  2. Target-Phase: Das Ereignis erreicht das Zielelement.
  3. Bubbling-Phase: Nachdem das Ziel erreicht wurde, steigt das Ereignis vom Zielelement wieder zurück zum Dokument auf.

Standardmäßig propagieren die meisten Ereignisse in JavaScript in der Bubbling-Phase, sofern nicht anders angegeben.

Event Bubbling

In der Bubbling-Phase beginnt ein Ereignis beim spezifischsten Element (dem tiefstmöglichen Punkt in der Dokumentstruktur) und fließt dann nach oben zum am wenigsten spezifischen Knoten (Dokumentobjekt). Dies ist das Standardverhalten für die meisten Ereignisse.

Beispiel für Event Bubbling:


html
<div onclick="alert('You clicked the DIV!');">
  Click me or one of my children:
  <p onclick="alert('You clicked the P!');">Click me!</p>
</div>

Wenn Sie auf das <p>-Element klicken, sehen Sie zuerst die Meldung für das <p>-Element und dann eine Meldung für das <div>-Element, während das Ereignis nach oben bubbelt.

Event Capturing

Capturing ist die erste Phase des Ereignis-Propagationsmodells, in der das Ereignis zum Zielelement hinabgeht. Es wird nicht häufig verwendet, kann aber nützlich sein, um Ereignisse zu behandeln, bevor sie ein Ziel erreichen.

Um auf Ereignisse in der Capturing-Phase zu hören, setzen Sie das dritte Argument von addEventListener auf true:


javascript
<div id="outer" onclick="alert('Clicked the DIV!');">
  Click me or one of my children:
  <p id="inner" onclick="alert('Clicked the P!');">Click me!</p>
</div>

<script>
  document.getElementById('outer').addEventListener('click', function() {
    alert('Captured the click on DIV!');
  }, true); // Set to true to handle in the capturing phase

  document.getElementById('inner').addEventListener('click', function() {
    alert('Captured the click on P!');
  }, true);
</script>

Wenn Sie auf das <p>-Element klicken, sehen Sie zuerst die Capturing-Meldungen für <div> und <p>, bevor die normalen Bubbling-Meldungen erscheinen.

Praktische Beispiele für Event Bubbling und Capturing

Beispiel 1: Event Bubbling verhindern

Manchmal möchten Sie verhindern, dass ein Ereignis im DOM-Baum nach oben bubbelt:


html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Event Propagation Example</title>
<style>
  .container {
    width: 200px;
    height: 200px;
    background-color: lightblue;
    padding: 20px;
  }

  .box {
    width: 100px;
    height: 100px;
    background-color: pink;
    margin-top: 20px;
    cursor: pointer;
  }
</style>
</head>
<body>

<div class="container" onclick="alert('You clicked the container!');">
  Click the pink box to see event propagation:
  <div class="box" onclick="event.stopPropagation(); alert('You clicked the box without bubbling!');"></div>
</div>

</body>
</html>

In diesem Beispiel gibt es einen Container mit hellblauem Hintergrund, der eine pinke Box enthält. Wenn Sie irgendwo innerhalb des Containers klicken, wird eine Meldung angezeigt: „You clicked the container!“. Wenn Sie jedoch auf die pinke Box klicken, wird eine andere Meldung angezeigt: „You clicked the box without bubbling!“, weil event.stopPropagation() verhindert, dass das Klickereignis zum Container hochbubbelt.

Beispiel 2: Sowohl Bubbling als auch Capturing verwenden

Dieses Beispiel zeigt, wie ein Ereignis sowohl in der Capturing- als auch in der Bubbling-Phase behandelt wird:


html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Event Capture and Bubbling Example</title>
<style>
  body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
  }

  #outerContainer {
    border: 2px solid #ccc;
    padding: 20px;
    margin-bottom: 20px;
    background-color: #f9f9f9;
    border-radius: 10px;
  }

  #innerElement {
    background-color: #ffa8a8;
    padding: 10px;
    border-radius: 5px;
    cursor: pointer;
  }
</style>
</head>
<body>

<div id="outerContainer" onclick="alert('Event Bubbled from Outer Container');">
  <p style="margin: 0;">Click anywhere in this outer container:</p>
  <p id="innerElement">Click me!</p>
</div>

<script>
  // Event listener attached to the outer container during the capturing phase
  document.getElementById('outerContainer').addEventListener('click', function() {
    alert('Event Captured by Outer Container');
  }, true);

  // Event listener attached to the inner element during the bubbling phase
  document.getElementById('innerElement').addEventListener('click', function() {
    alert('Event Bubbled from Inner Element');
  }, false);
</script>

</body>
</html>
  • Outer Container (#outerContainer): Stellen Sie sich dies als die größte Box vor. Sie enthält etwas Text mit der Aufschrift „Click anywhere in this outer container:“. In dieser Box befindet sich eine weitere, kleinere Box.

    • Inner Element (#innerElement): Dies ist die kleinere Box innerhalb der größeren. Sie enthält den Text „Click me!“. Diese Box befindet sich im äußeren Container.
  • Event Listeners:

    • Event Capturing: Wenn Sie irgendwo auf den äußeren Container klicken, wird zuerst eine Meldung angezeigt: „Event Captured by Outer Container“. Es ist, als würde jemand das Ereignis auffangen, wenn es in den äußeren Container eintritt.
    • Event Bubbling: Wenn Sie auf die innere Box („Click me!“) klicken, bubbelt das Ereignis nach oben. Es ist, als würde eine Blase von der inneren Box zum äußeren Container aufsteigen. Wenn es den äußeren Container erreicht, wird eine weitere Meldung angezeigt: „Event Bubbled from Inner Element“.

Also fängt der äußere Container das Ereignis auf, wenn Sie irgendwo darauf klicken, und wenn Sie auf die innere Box klicken, bubbelt das Ereignis zum äußeren Container hoch. So funktionieren Event Capturing und Bubbling in HTML!

Fazit

Das Verständnis von Event Bubbling und Capturing ermöglicht es Ihnen, die Ereignis-Propagation in Ihren Webanwendungen effektiv zu steuern. Indem Sie verwalten, wie Ereignisse durch diese Phasen behandelt werden, können Sie die Interaktivität Ihrer Anwendung verbessern, unerwünschte Ereignis-Propagation verhindern und sicherstellen, dass Ereignisse gemäß Ihren spezifischen Anforderungen verarbeitet werden.

Practice

What are the two phases of event propagation mentioned in the provided URL?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.