So verwenden Sie die MutationObserver-API für Änderungen an DOM-Knoten
Hier ist ein Szenario: Rita, eine Zeitschriftenautorin, editiert einen Artikel von ihr online. Sie speichert ihre Änderungen und sieht die Nachricht “Änderungen gespeichert!” In diesem Moment bemerkt sie einen Tippfehler, den sie übersehen hat. Sie behebt das Problem und will gerade klicken “sparen”, als sie einen wütenden Anruf von ihrem Chef erhält.
Nachdem der Anruf beendet ist, kehrt sie zum Bildschirm zurück und sieht “Änderungen gespeichert!” fährt ihren Computer herunter und stürmt aus dem Büro.
Abgesehen von meiner Unfähigkeit, Geschichten zu erzählen, bemerkten wir in diesem kurzen Szenario, welche Schwierigkeiten diese beharrliche Botschaft hervorbrachte. In Zukunft entscheiden wir uns daher, dies zu vermeiden, wenn möglich, und verwenden eine, die den Benutzer dazu auffordert, durch Anklicken zu bestätigen - oder verschwindet von selbst. Die zweite für kurze Nachrichten zu verwenden, ist eine gute Idee.
Wir wissen bereits, wie man ein Element von einer Seite verschwinden lässt. Das sollte also kein Problem sein. Was wir wissen müssen, ist wann ist es erschienen? So können wir es nach einer plausiblen Zeit verschwinden lassen.
MutationObserver-API
Insgesamt, wenn ein DOM-Element (wie eine Nachricht) div
) oder andere Knotenänderungen, sollten wir es wissen können. Entwickler mussten sich lange Zeit auf Hacks und Frameworks verlassen, da es keine native API gab. Aber das hatte sich geändert.
Wir haben nun MutationObserver (zuvor Mutationsereignisse). MutationObserver
ist ein natives JavaScript-Objekt mit einer Reihe von Eigenschaften und Methoden. Es lässt uns Beobachten Sie eine Änderung an einem beliebigen Knoten wie DOM-Element, Dokument, Text usw. Unter Mutation meinen wir das Hinzufügen oder Entfernen eines Knotens und Änderungen am Attribut und den Daten eines Knotens.
Sehen wir uns ein Beispiel zum besseren Verständnis an. Zuerst legen wir eine Einstellung fest, bei der eine Nachricht auf Knopfdruck erscheint, wie sie von Rita gesehen wurde. Nun gut Erstellen und verknüpfen Sie einen Mutationsbeobachter mit diesem Meldungsfeld und codieren Sie die Logik, um die Nachricht automatisch auszublenden. Kapieren?
Hinweis: Sie haben mich vielleicht schon einmal gefragt oder haben mich schon in Ihrem Kopf gefragt “Warum verstecken Sie die Nachricht nicht einfach innerhalb des Schaltflächenklickereignisses selbst in JavaScript?” In meinem Beispiel arbeite ich nicht mit einem Server, daher ist der Client natürlich dafür verantwortlich, die Nachricht anzuzeigen und kann sie zu leicht ausblenden. Aber wie in Ritas Bearbeitungstool, wenn der Server derjenige ist, der den DOM-Inhalt ändern möchte, kann der Client nur wachsam bleiben und warten.
Zuerst erstellen wir das Setup, um die Nachricht beim Klicken auf die Schaltfläche anzuzeigen.
var msg = document.querySelector ('# msg'), SUCCESSMSG = "Änderungen gespeichert!"; / * Schaltfläche hinzufügen click event * / document .querySelector ('button') .addEventListener ('click', showMsg); function showMsg () msg.textContent = SUCCESSMSG; msg.style.background = 'teal';
Sobald das erste Setup ausgeführt wurde, können Sie Folgendes tun:
- Ein ... kreieren
MutationObserver
Objekt mit einer benutzerdefinierten Rückruffunktion (die Funktion wird später im Beitrag definiert). Die Funktion wird bei jeder vom System beobachteten Mutation ausgeführtMutationObserver
. - Erstellen Sie ein Konfigurationsobjekt, um die Art der Mutationen anzugeben, die von beobachtet werden sollen
MutationObserver
. - Binden Sie die
MutationObserver
zum Ziel, das ist die "msg"div
in unserem Beispiel.
(Funktion startObservation () var / * 1) Erstellen Sie ein MutationObserver-Objekt * / observer = new MutationObserver (Funktion (Mutationen) mutationObserverCallback (mutations);), / * 2) Erstellen Sie ein Konfigurationsobjekt * / config = childList: wahr; / * 3) Glue'em all * / observer.observe (msg, config); ) ();
Nachfolgend finden Sie eine Liste von Eigenschaften für die Konfig
Objekt zur Identifizierung der verschiedenen Arten von Mutationen. Da wir in unserem Beispiel nur einen untergeordneten Textknoten behandeln, der für den Nachrichtentext erstellt wurde, haben wir den childList
Eigentum.
Arten von Mutationen beobachtet
Eigentum | Wenn eingestellt auf wahr |
childList | Das Einfügen und Entfernen der Kindknoten des Ziels wird beobachtet. |
Attribute | Änderungen in den Attributen des Ziels werden beobachtet. |
characterData | Änderungen in den Daten des Ziels werden beobachtet. |
Nun zu der Callback-Funktion, die bei jeder beobachteten Mutation ausgeführt wird.
Funktion mutationObserverCallback (Mutationen) / * Erste Mutation ergreifen * / var mutationRecord = Mutationen [0]; / * Wenn ein untergeordneter Knoten hinzugefügt wurde, blenden Sie die msg nach 2s aus. * / If (mutationRecord.addedNodes [0]! == undefined) setTimeout (hideMsg, 2000); function hideMsg () msg.textContent = "; msg.style.background = 'none';
Da fügen wir dem nur eine Nachricht hinzu div
, Wir packen einfach die erste Mutation und prüfen, ob ein Textknoten eingefügt wurde. Wenn sich mehr als eine Änderung ereignet, können wir einfach durch die Mutationen
Array.
Jede Mutation im Mutationen
Array wird durch das Objekt dargestellt MutationRecord
mit den folgenden Eigenschaften.
Eigentum von MutationRecord
Eigentum | Kehrt zurück |
addedNodes | Leeres Array oder Array von Knoten hinzugefügt. |
Attributname | NULL oder Name des Attributs, das hinzugefügt, entfernt oder geändert wurde. |
AttributNamespace | Null- oder Namespace des Attributs, das hinzugefügt, entfernt oder geändert wurde. |
nextSibling | Null- oder nächster gleichgeordneter Knoten, der hinzugefügt oder entfernt wurde. |
oldValue | Nullwert oder vorheriger Wert des Attributs oder der Daten wurde geändert. |
vorheriges Geschwister | Null oder vorheriges gleichgeordnetes Element des Knotens, der hinzugefügt oder entfernt wurde. |
removeNodes | Leeres Array oder Array von Knoten, die entfernt wurden. |
Ziel | Knoten, der von der Zielgruppe angesteuert wird MutationObserver |
Art | Art der beobachteten Mutation. |
Und das ist es. Wir müssen nur den Code für den letzten Schritt zusammenstellen.
Browser-Unterstützung
Referenz
- “W3C DOM4-Mutationsbeobachter.” W3C. Netz. 19. Juni 2015
- “MutationObserver.” Mozilla Developer Network. Netz. 19. Juni 2015.