Kann ein einzelnes MutationObserver-Objekt mehrere Ziele beobachten?

Lesezeit: 3 Minuten

Benutzer-Avatar
Lukas

Ich möchte eine verwenden MutationObserver Objekt, um Änderungen an einigen meiner DOM-Knoten zu beobachten.

Die Dokumentation enthält ein Beispiel zum Erstellen einer MutationObserver Objekt und Registrierung auf einem Ziel.

// select the target node
var target = document.querySelector('#some-id');

// create an observer instance
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});

// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };

// pass in the target node, as well as the observer options
observer.observe(target, config);

Angenommen, ich habe den obigen Code, aber direkt darunter platziere ich diesen Code:

var target2 = document.querySelector('#some-other-id');
var config2 = {attributes: true, subtree: true};
observer.observe(target2, config2);

Werden observer:

  • jetzt 2 Ziele beobachten?
  • wird es aufhören zu beobachten target?
  • wird es entscheiden, nicht zu beobachten target2?
  • wird es einen Fehler werfen?
  • oder wird es ein anderes Verhalten zeigen?

  • ist es möglich, eine zu beobachten {} für Änderungen mit MutationObserver??

    – alter Junge

    24. Januar 2020 um 22:42 Uhr

Benutzer-Avatar
scniro

Der Beobachter beobachtet nun zwei Ziele – target und target2 nach Ihren Definitionen. Es wird kein Fehler ausgegeben, und target wird nicht zugunsten von “abgemeldet”. target2. Es werden keine unerwarteten oder anderen Verhaltensweisen gezeigt.

Hier ist ein Beispiel, das dasselbe verwendet MutationObserver auf zwei contenteditable Elemente. Um dies anzuzeigen, löschen Sie die <span> Knoten von jedem contenteditable Element und zeigen Sie die Verhaltensspanne über beide beobachteten Elemente an.

<div id="myTextArea" contenteditable="true">
    <span contenteditable="false">Span A</span>
</div>

<div id="myTextArea2" contenteditable="true">
    <span contenteditable="false">Span B</span>
</div>

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
      //console.log($(mutation.removedNodes)); // <<-- includes text nodes

      $(mutation.removedNodes).each(function(value, index) {
          if(this.nodeType === 1) {
              console.log(this)
          }
      });
  });
});

var config = { attributes: true, childList: true, characterData: true };

observer.observe($('#myTextArea')[0], config);

observer.observe($('#myTextArea2')[0], config);

JSFiddle-Link – demonstrieren

Beachten Sie, dass ich dieselbe Konfiguration für diese erste Demo wiederverwendet habe, aber das Platzieren einer neuen Konfiguration wird ausschließlich für dieses beobachtete Element gelten. Nehmen Sie Ihr Beispiel, wie in definiert config2falls verwendet auf #myTextArea2sehen Sie den protokollierten Knoten nicht gemäß den Konfigurationsoptionen, aber beachten Sie, dass der Beobachter für #myTextArea ist unbeeinflusst.

JSFiddle-Link – Demo – Exklusivität der Konfiguration

  • Sehr schön! Obwohl ich mich frage, ob dies in allen Browsern konsistent funktioniert, und ich frage mich, ob es konsistent ist, wenn Sie zufällig ein Element innerhalb eines Elements beobachten, mit dem Sie begonnen haben, es zu beobachten?

    – NoBugs

    13. Juni 2015 um 5:48 Uhr


  • Beachten Sie auch, dass das mehrmalige Beobachten desselben Ziels nicht zu mehreren Aufrufen des Callbacks für Änderungen an diesem Element führt.

    – Majormann

    13. März 2016 um 10:11 Uhr

  • Dabei gibt es ein Problem: Wie machen wir das? unbeobachtet eines der Elemente, die wir beobachten? Es scheint wie die disconnect() -Methode bewirkt, dass ein MutationObserver aufhört, alle Elemente zu beobachten! Das bedeutet, dass es keine Bereinigung pro Element gibt, was die Möglichkeit von Speicherlecks bedeutet!!

    – trusktr

    26. Juli 2017 um 23:59 Uhr


  • Nun, ich denke, Sie müssen die Verbindung trennen und dann nur die Elemente erneut beobachten, die Sie benötigen. Ich würde es fast vorziehen, eine Live-HTMLCollection zu übergeben und alle diese Elemente automatisch überwachen zu lassen, selbst wenn Knoten hinzugefügt und entfernt werden.

    – James Coyle

    22. Januar 2018 um 11:56 Uhr

  • @theonlygusti Anscheinend gibt es nur zwei Möglichkeiten: Verwenden Sie ein MO pro Element oder trennen Sie die Verbindung bei einem einzelnen MO und beobachten Sie dann erneut alle Elemente mit Ausnahme des Elements, das Sie nicht mehr beobachten möchten. Es gibt auch eine Spezifikationsdiskussion zum Hinzufügen einer API dafür: github.com/WICG/webcomponents/issues/940

    – trusktr

    10. September 2021 um 0:01 Uhr


1216560cookie-checkKann ein einzelnes MutationObserver-Objekt mehrere Ziele beobachten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy