> ## Documentation Index
> Fetch the complete documentation index at: https://docs.baenninger.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Event Propagation

Event Propagation beschreibt den Prozess, wie sich Events (wie Klicks oder Tastatureingaben) durch den DOM-Baum einer Webseite ausbreiten - zunächst in der Capturing-Phase von oben nach unten, dann in der Bubbling-Phase von unten nach oben durch die verschachtelten HTML-Elemente.

Es passiert folgendes, wenn beispielweise ein Click Event erstellt wird:

<Steps>
  <Step title="`document`">
    Das Click Event wird an das `document` angehängt.

    <Frame caption="document">
      <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/image-20.png?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=697b9998e47ff0f86a26bd694c914eb1" alt="document" width="1920" height="951" data-path="images/content/web/image-20.png" />
    </Frame>
  </Step>

  <Step title="Capturing Phase">
    Das Event durchläuft jedes Parent-Element des Target-Elements (Element mit dem Event-Listener).

    <Frame caption="Capturing Phase">
      <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/image-21.png?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=32c8f1d134b35e21a9e76f0569534cc1" alt="Capturing Phase" width="1918" height="949" data-path="images/content/web/image-21.png" />
    </Frame>
  </Step>

  <Step title="Target Phase">
    In der Target Phase werden die Events beim Target verarbeitet. Das machen wir mit Event-Listeners.

    <Frame caption="Target Phase">
      <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/image-22.png?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=91ba430c978bd6100308b98499627ae5" alt="Target Phase" width="1918" height="946" data-path="images/content/web/image-22.png" />
    </Frame>
  </Step>

  <Step title="Bubbling Phase">
    Das Event durchläuft nun wieder jedes Parent-Element bis zum `document`. Wenn das passiert ist es für JavaScript so, als ob das Event auch in einem der Parent-Elemente passiert wäre.

    Das heisst wir können an unsere Parent-Elemente ebenfalls Event-Listener anhängen. Diese werden auch dann aufgerufen, wenn ein Child-Element das Target-Element war.

    <Frame caption="Bubbling Phase">
      <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/image-23.png?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=db6e1341be28aba6c1f715f97cf82553" alt="Bubbling Phase" width="1918" height="951" data-path="images/content/web/image-23.png" />
    </Frame>

    Mit einem kleinen Trick können wir uns das auch in der Capturing Phase zu nutze machen.
  </Step>
</Steps>

## Bubbling Phase

Um die Events in der Bubbling Phase abzufangen, müssen wir Event-Handler an die Parent-Elemente anhängen.

```javascript theme={null}
const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);
const randomColor = () =>
  `rgb(${randomInt(0, 255)}, ${randomInt(0, 255)}, ${randomInt(0, 255)})`;

document.querySelector('.nav__link').addEventListener('click', (e) => {
  this.style.backgroundColor = randomColor();
});

document.querySelector('.nav__links').addEventListener('click', (e) => {
  this.style.backgroundColor = randomColor();
});

document.querySelector('.nav').addEventListener('click', (e) => {
  this.style.backgroundColor = randomColor();
});
```

Wenn wir nun auf ein Element mit der Klasse `.nav__link` klicken, werden sowohl bei diesem Element, als auch `.nav__links` und `.nav` die Hintergrundfarben verändert.

### `target` und `currentTarget`

Das Target-Element ist bei jedem der obigen Event-Listener gleich. Jedoch können wir auf das eigentliche Target-Element über `currentTarget` zugreifen.

<Info>
  `currentTarget` entspricht im Event-Listener `this`.
</Info>

### Propagation stoppen

Um dieses Verhalten zu verhindern können wir im Target-Element die Methode `stopPropagation` auf dem Event aufrufen.

```javascript theme={null}
document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  e.stopPropagation();
});
```

## Capturing Phase

Wir können das Standardverhalten des Event-Listeners mit einem Argument überschreiben:

```javascript theme={null}
document.querySelector('.nav').addEventListener('click', (e) => {
  this.style.backgroundColor = randomColor();
}, true);
```

Jetzt wird das Event in der Capturing Phase abgefangen und nicht in der Bubbling Phase.
