Les MutationObserver

Les MutationObserver

Problèmatique

En JavaScript, il arrive souvent qu’on veuille réagir à des changements dans la page :

Exemple

prenons l'exemple d'une page sur laquelle un élément apparaît plus tard

  • <div id="app"></div>

A présent un simple script pour ajouter du contenu après 2 secondes

  • setTimeout(() => {
    • document.getElementById("app").innerHTML = "<p>Contenu chargé</p>";
  • },2000);

Tentons une approche naïve pour surveiller les changements.

  • const interval = setInterval(() => {
    • const el = document.querySelector("#app p");
      • if (el) {
        • console.log("Élément détecté !");
        • clearInterval(interval);
        }
  • }, 100);

Pas mal mais cette approche devient vite inefficace dès qu'on a des interfaces dynamiques ou du contenu injecté par des scripts tiers.

La solution du MutationObserver

MutationObserver fonctionne comme un "listener intelligent du DOM" qui réagit uniquement quand quelque chose change, sans vérifier en boucle.

Etape 1

récupérer notre élément

  • const target = document.getElementById("app");

Etape 2

Créer l'objet observer

  • const observer = new MutationObserver((mutations) => {
    • mutations.forEach((mutation) => {
      • console.log("Changement détecté :", mutation);
        • if (target.querySelector("p")) {
          • console.log("Élément détecté !");
          • observer.disconnect(); // on arrête d'observer
      • }
    • });
  • });

Etape 3

Pour finir, nous allons attacher notre cible avec notre observer

  • observer.observe(target, {
    • childList: true,
    • subtree: true,
  • });

Ce que l'on gagne

  1. Performance

    Pas de boucle infinie, pas de polling.

  2. Réactivité

    Notification immédiate quand le DOM change.

  3. Précision

    Possibilité de cibler ce que l'on veut observer :

    • ajout/suppression d’enfants (childList)
    • modifications d’attributs (attributes)
    • changements de sous-arbre (subtree)
Partager
Partager sur Twitter