Zum Inhalt springen

JavaScript MutationObserver-API

Mutation Observer in JavaScript ermöglichen es dir, Änderungen am DOM zu überwachen und dynamisch darauf zu reagieren. Dieser interaktive Leitfaden bietet einen einfachen, praxisnahen Ansatz, um zu verstehen, wie Mutation Observer funktionieren, mit Beispielen, die Änderungen visuell demonstrieren.

Mutation Observer Beispiel

Hier ist ein grundlegendes Beispiel, das dir zeigt, wie ein Mutation Observer funktioniert, indem Änderungen im DOM visuell hervorgehoben werden.


html
<!DOCTYPE html>
<html>
<head>
  <title>Exploring DOM Changes: Live Examples with Mutation Observers</title>
</head>
<body>
  <div id="target" style="background-color: lightgray; padding: 10px;">
    Watch this space for changes!
  </div>
  <button style="margin-top: 10px;" onclick="addNewElement(); changeAttribute();">Add New Element and Change Color</button>
  <div id="log" style="margin-top: 20px;"></div>

  <script>
    // Get the element to observe
    const targetNode = document.getElementById('target');

    // Define configurations for the observer
    const config = { attributes: true, childList: true, subtree: true, attributeOldValue: true };

    // Callback function to execute when mutations are observed
    const callback = function(mutationsList, observer) {
      for (const mutation of mutationsList) {
        const message = document.createElement('p');
        if (mutation.type === 'childList') {
          message.textContent = 'A child node has been added or removed.';
          message.style.color = 'green';
        } else if (mutation.type === 'attributes') {
          message.textContent = 'The ' + mutation.attributeName + ' attribute was modified.';
          message.style.color = 'blue';
        }
        document.getElementById('log').appendChild(message);
      }
    };

    // Create an observer instance linked to the callback function
    const observer = new MutationObserver(callback);

    // Start observing the target node for configured mutations
    observer.observe(targetNode, config);

    // Function to add new elements
    function addNewElement() {
      const newElement = document.createElement('div');
      newElement.textContent = 'New element added!';
      targetNode.appendChild(newElement);
    }

    // Function to change attributes
    function changeAttribute() {
      const currentColor = targetNode.style.backgroundColor;
      targetNode.style.backgroundColor = currentColor === 'lightgray' ? 'lightblue' : 'lightgray';
    }
  </script>
</body>
</html>

Dieses Beispiel zeigt, wie man einen Mutation Observer verwendet, um Änderungen an einem Document Object Model (DOM) einer Webseite zu erkennen und darauf zu reagieren. Hier ist, was jeder Teil des JavaScript macht und was du erwarten kannst, wenn du mit dem Beispiel interagierst:

  1. Mutation Observer einrichten:
    • Zielknoten: Dies ist das DOM-Element, das du beobachten möchtest. In diesem Fall ist es das div mit der ID target.
    • Konfigurationen: Diese legen fest, welche Arten von Änderungen du überwachen möchtest:
      • attributes: Der Observer sucht nach Änderungen an Attributen (wie style oder class).
      • childList: Es wird nach dem Hinzufügen oder Entfernen von Kindelementen gesucht (z. B. neu hinzugefügte divs).
      • subtree: Dadurch wird sichergestellt, dass der Observer nicht nur das Zielelement, sondern auch seine Nachkommen überprüft. Beachte, dass subtree nur wirksam wird, wenn auch childList oder attributes aktiviert ist.
      • attributeOldValue: Dies speichert den vorherigen Wert eines beliebigen Attributs, das geändert wird (nützlich zum Nachverfolgen von Änderungen).
  2. Callback-Funktion definieren:
    • Diese Funktion wird jedes Mal ausgeführt, wenn der Observer basierend auf den festgelegten Konfigurationen eine Änderung erkennt.
    • Sie durchläuft alle erkannten Mutationen und erstellt für jede eine Logmeldung:
      • Wenn ein Kindelement hinzugefügt oder entfernt wird, wird in grünem Text „A child node has been added or removed.“ protokolliert.
      • Wenn ein Attribut geändert wird (z. B. die Hintergrundfarbe), wird in blauem Text „The mutation.attributeName attribute was modified.“ protokolliert.
  3. Observer-Instanz:
    • Der Mutation Observer wird erstellt und mit der Callback-Funktion verknüpft.
  4. Beobachtung starten:
    • Der Observer beginnt, das target-div auf alle in den Konfigurationen angegebenen Änderungen zu überwachen.
  5. Interaktive Funktionen:
    • Neues Element hinzufügen: Ausgelöst durch einen Klick auf den Button, fügt diese Funktion ein neues div mit dem Text „New element added!“ innerhalb des target-div hinzu.
    • Attribut ändern: Ebenfalls durch denselben Klick auf den Button ausgelöst, schaltet diese Funktion die Hintergrundfarbe des target-div zwischen 'lightgray' und 'lightblue' um. Hinweis: Obwohl inline onclick für dieses Beispiel funktioniert, wird für eine sauberere Trennung des Codes in der Produktion addEventListener empfohlen.

Erwartete Ergebnisse:

  • Ein neues Element hinzufügen:
    • Jedes Mal, wenn du auf den Button klickst, wird ein neues div hinzugefügt. Dadurch wird die childList-Prüfung des Observers ausgelöst, und du siehst eine grüne Meldung mit dem Text „A child node has been added or removed.“
  • Ein Attribut ändern:
    • Derselbe Klick auf den Button ändert die Hintergrundfarbe des target-div. Dadurch wird die Attributprüfung des Observers ausgelöst. Du siehst eine blaue Meldung, die angibt, welches Attribut geändert wurde („The style attribute was modified.“).

Dieses Beispiel demonstriert effektiv, wie Mutation Observer verwendet werden können, um Änderungen im DOM zu überwachen und zu protokollieren, und bietet Echtzeit-Feedback darüber, was innerhalb der Webseite geschieht.

Fazit

Mutation Observer sind ein wichtiger Bestandteil des JavaScript-Toolkits und bieten dynamische Lösungen für die effiziente Verwaltung von DOM-Änderungen. Sie ermöglichen es Entwicklern, reaktionsfähige, interaktive Webanwendungen zu erstellen, die nahtlos auf Benutzerinteraktionen und programmatische DOM-Änderungen reagieren. Obwohl sie leistungsstark sind, ist es wichtig, Mutation Observer umsichtig einzusetzen, um optimale Leistung und Benutzererfahrung zu gewährleisten. Durch die sorgfältige Auswahl der zu beobachtenden Mutationen, die Minimierung des Overheads in Mutation-Callbacks und das Aufrufen von observer.disconnect(), wenn der Observer nicht mehr benötigt wird, um Speicherlecks zu verhindern, können Entwickler Mutation Observer nutzen, um die Funktionalität einer Website zu verbessern, ohne die Effizienz zu beeinträchtigen. Das Verständnis und die Anwendung dieser Prinzipien ermöglichen die Erstellung fortgeschrittener, benutzerfreundlicher Weboberflächen, die sich in der modernen digitalen Landschaft abheben.

Practice

Which of the following statements are true regarding the JavaScript Mutation Observer?

Finden Sie das nützlich?

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