1. Grundlegende VerwendungEs kann über den MutationObserver-Konstruktor instanziiert werden und der Parameter ist eine Rückruffunktion. let observer = neuer MutationObserver(() => console.log("ändern")); Konsole.log(Beobachter); Die Prototypenkette des Beobachterobjekts sieht wie folgt aus: MutationObserver-Instanz: Sie können sehen, dass es die Methoden 1. Beobachtermethode Überwachung Die Syntax lautet wie folgt: // Erhalte zwei Parameter: Observer (DOM-Element, MutationObserverInit-Objekt);
Beispiel 1: Änderungen in der Body-Elementklasse überwachen: let observer = neuer MutationObserver(() => console.log("ändern")); //Überwachen Sie die Attributänderungen des Body-Elements observer.observe(document.body, { Attribute: wahr }); // Durch Ändern der Klasse des Body-Elements wird die Rückruffunktion asynchron ausgeführt, die beim Erstellen des MutationObserver-Objekts übergeben wurde. document.body.className = "main"; console.log("Body-Attribute geändert"); // Konsolenausgabe: // Die Body-Attribute wurden geändert // ändern Die Ausgabe der obigen 2. Fügen Sie der Callback-Funktion den Array-Parameter der MutationRecord-Instanz hinzuNun ist die Rückruffunktion sehr simpel, sie gibt lediglich einen String aus und es ist unklar, welche Änderungen stattgefunden haben. Tatsächlich erhält die Rückruffunktion ein Array von let observer = neuer MutationObserver( // Die Rückruffunktion ist ein Array von MutationRecord-Instanzen. Das Format ist wie folgt: // [Mutationsdatensatz, Mutationsdatensatz, Mutationsdatensatz, ...] (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); Dokument.Body.Klassenname = "Haupt"; console.log("Body-Attribute geändert"); // Konsolenausgabe: // Die Body-Attribute wurden verändert // (1) [MutationRecord] Die MutationRecords-Informationen lauten wie folgt: MutationRecord-Beispiel : Einige der wichtigeren Informationen:
Wenn Sie die Attribute des Textkörpers mehrmals ändern, entstehen mehrere Datensätze: // Mutationsaufzeichnung let Beobachter = neuer MutationObserver( // Die Rückruffunktion empfängt eine MutationRecord-Instanz, die ein Array ist. (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Dreimal ändern document.body.className = "main"; Dokument.Body.Klassenname = "Container"; Dokument.Body.Klassenname = "Box"; // Die Konsole druckt Folgendes: // (3) [Mutationsdatensatz, Mutationsdatensatz, Mutationsdatensatz] Beachten:
3. Die Disconnect-Methode beendet den RückrufWenn Sie den Rückruf beenden möchten, können Sie die Methode „Disconnect“ verwenden. let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Erste Änderung document.body.className = "main"; //Beenden Sie observer.disconnect(); // Zweite Änderung document.body.className = "container"; // Keine Log-Ausgabe Eine Log-Ausgabe, auch der ersten Änderung, erfolgt hier nicht, da die Callback-Funktion asynchron und zuletzt ausgeführt wird. Mit „setTimeout“ können Sie die endgültige Beendigung steuern, sodass der Rückruf normal ausgeführt wird. let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Erste Änderung document.body.className = "main"; // Beenden setTimeout(() => { Beobachter.trennen(); // Die dritte Änderung, die folgende Änderung wird nicht zurückgerufen document.body.className = "container"; }, 0); // Zweite Änderung document.body.className = "container"; // Seitenausgabe: // (2) [Mutationsdatensatz, Mutationsdatensatz] Reaktivierung nach Kündigung Nach dem Beenden können Sie es neu starten, siehe folgendes Beispiel: let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Die erste Änderung wird in das Array „mutationRecords“ eingetragen. document.body.className = „main“; // Beenden setTimeout(() => { Beobachter.trennen(); // Zweite Änderung, da diese beendet wird, werden die folgenden Änderungen nicht in das mutationRecords-Array eingetragen document.body.className = "container"; }, 0); setzeTimeout(() => { // Beobachter erneut aktivieren.observe(document.body, { Attribute: wahr }); // Ändern Sie die Body-Attribute und geben Sie das mutationRecords-Array ein. document.body.className = "container"; }, 0); // Konsolenausgabe: // [Mutationsdatensatz] // [Mutationsdatensatz] Die Rückruffunktion wird hier zweimal ausgeführt und druckt zwei Werte:
Bei der zweiten Änderung werden die geänderten 4. Die Methode takeRecords ruft geänderte Datensätze ab Wenn Sie die vorhandenen let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Die erste Änderung wird in das mutationRecords-Array eingetragen document.body.className = "main"; // Die zweite Änderung wird in das mutationRecords-Array eingetragen document.body.className = "container"; // Die dritte Änderung wird in das mutationRecords-Array eingetragen document.body.className = "box"; // Änderungsdatensatz abrufen und verarbeiten let mutationRecords = observer.takeRecords(); console.log(Mutationsdatensätze); // Konsolendruck: // (3) [Mutationsdatensatz, Mutationsdatensatz, Mutationsdatensatz] Konsole.log(Beobachter.takeRecords()); // Konsolendruck: // [] //Beenden Sie observer.disconnect(); 2. Auf mehrere Elemente hören Die obige Überwachung hat nur ein Element. Wenn Sie mehrere Elemente überwachen möchten, können Sie let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Div1-Element erstellen und abhören let div1 = document.createElement("div"); Beobachter.beobachten(div1, { Attribute: wahr }); div1.id = "Box1"; // div2 erstellen und abhören let div2 = document.createElement("div"); Beobachter.beobachten(div2, { Attribute: wahr }); div2.id = "Box2"; // Konsolendruck: // (2) [Mutationsdatensatz, Mutationsdatensatz] Die Konsole druckt zwei MutationRecords, darunter:
Andere Verwendungen ähneln den oben genannten. 3. Überwachungsbereich MutationObserverInit-ObjektBei der obigen Überwachung geht es um die Überwachung von Attributen. Natürlich können Sie auch andere Dinge überwachen, beispielsweise: Text, untergeordnete Knoten usw. 1. Eigenschaften beobachtenDie obigen Beispiele berücksichtigen alle die Attribute des Elements selbst. Hier ist ein weiteres Beispiel für benutzerdefinierte Attribute. let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: wahr }); // Benutzerdefinierte Attribute ändern document.body.setAttribute("data-id", 1); // Konsolendruck: // [Mutationsdatensatz] Das Ändern benutzerdefinierter Attribute wird auch zum Erwähnenswert ist auch, dass attributeFilter-Filterung: Wenn Sie Änderungen in angegebenen Attributen überwachen möchten, können Sie zum Filtern let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); Beobachter.beobachten(Dokument.Text, { Attribute: true, // Whitelist-Attributfilter festlegen: ["data-id"] }); //Ändern Sie die Attribute in der Whitelist attributeFilter und geben Sie mutationRecords ein document.body.setAttribute("Daten-ID", 1); // Ändern Sie die Attribute, die nicht in der Whitelist attributeFilter sind und nicht in mutationRecords eingetragen werden document.body.setAttribute("Klasse", "Haupt"); // Konsolendruck: // [Mutationsdatensatz] attributeOldValue zeichnet den alten Wert auf : Wenn Sie den alten Wert aufzeichnen möchten, können Sie let Beobachter = neuer MutationObserver( // oldValue im MutationRecord-Objekt stellt den alten Wert dar (mutationRecords) => console.log(mutationRecords.map((x) => x.oldValue)) ); Beobachter.beobachten(Dokument.Text, { Attribute: true, attributeOldValue: true, }); // Erste Änderung, da ursprünglich kein Wert vorhanden ist, alter Wert oldValue = null document.body.setAttribute("Klasse", "Haupt"); // Zweite Änderung, da bereits einmal geändert, der alte Wert oldValue = main document.body.setAttribute("Klasse", "Container"); // Konsolendruck: // (2) [null, 'main'] 2. Beachten Sie den Text Um den Text zu beobachten, setzen Sie Betrachten Sie das folgende Beispiel: <!-- Ein sexy div --> <div id="box">Hallo</div> <Skripttyp="text/javascript"> let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Textknoten abrufen let textNode = document.getElementById("box").childNodes[0]; Beobachter.beobachten(textNode, { //Textänderungen beobachten characterData: true }); // Den Text ändern textNode.textContent = "Hi"; // Konsolendruck: // [Mutationsdatensatz] </Skript> Wenn Sie direkt auf das Div-Element hören, funktioniert es nicht: <!-- Ein sexy div --> <div id="box">Hallo</div> <Skripttyp="text/javascript"> let observer = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Das Abhören von div hat keine Wirkung let box = document.getElementById("box"); Beobachter.beobachten(box, { Zeichendaten: true }); box.textContent = "Hallo"; //Keine Ausgabe in der Konsole</script> characterDataOldValue zeichnet den alten Wert auf: Wenn Sie den alten Wert des Textes aufzeichnen möchten, können Sie <!-- Ein sexy div --> <div id="box">Hallo</div> <Skripttyp="text/javascript"> let Beobachter = neuer MutationObserver( (Mutationsaufzeichnungen) => Konsole.Protokoll(Mutationsaufzeichnungen.Map((x) => x.alterWert)) ); // Textknoten abrufen let textNode = document.getElementById("box").childNodes[0]; Beobachter.beobachten(textNode, { //Textänderungen beobachten characterData: true, // Alte Daten behalten characterDataOldValue: true, }); // Den Text zweimal ändern textNode.textContent = "Hi"; textNode.textContent = "Nett"; // Konsolendruck: // (2) ['Hallo', 'Hi'] </Skript> Da der ursprüngliche Inhalt im Div „Hallo“ war, wurde er zuerst in „Hi“ und dann in „Nice“ geändert. Daher lauten die alten Werte nach den beiden Änderungen: „Hallo“ und „Hi“. 3. Untergeordnete Knoten beobachten <!-- Ein sexy div --> <div id="box">Hallo</div> <Skripttyp="text/javascript"> let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Holen Sie sich das div let box = document.getElementById("box"); Beobachter.beobachten(box, { //Änderungen in untergeordneten Knoten beobachten childList: true, }); //Element hinzufügen let span = document.createElement("span") span.textContent = "Welt"; box.anhängenUntergeordnetesElement(span); // Konsolendruck: // [Mutationsdatensatz] </Skript> Das Attribut So entfernen Sie einen Knoten: <!-- Ein sexy div --> <div id="box">Hallo</div> <Skripttyp="text/javascript"> let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Holen Sie sich das div let box = document.getElementById("box"); Beobachter.beobachten(box, { //Änderungen in untergeordneten Knoten beobachten childList: true, }); // Entfernen Sie den ersten untergeordneten Knoten, bei dem es sich um den Textknoten „Hallo“ handelt. box.removeChild(box.childNodes[0]); // Konsolendruck: // [Mutationsdatensatz] </Skript> Mobiler Knoten: Wenn ein bestehender Knoten verschoben wird, werden zwei <!-- Ein sexy div --> <div id="box">Hallo<span>Welt</span></div> <Skripttyp="text/javascript"> let observer = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); // Holen Sie sich das div let box = document.getElementById("box"); Beobachter.beobachten(box, { //Änderungen in untergeordneten Knoten beobachten childList: true, }); // Verschiebe den Span-Knoten vor den Hello-Knoten box.insertBefore(box.childNodes[1], box.childNodes[0]); // Das Verschieben eines Knotens bedeutet eigentlich, ihn zuerst zu löschen und dann hinzuzufügen. // Konsolendruck: // (2) [Mutationsdatensatz, Mutationsdatensatz] </Skript> 4. Beobachten Sie den Teilbaum Die oben beobachteten Knoten sind alle aktuell festgelegten Zielknoten. Für Wenn Sie Änderungen am <!-- Ein sexy div --> <div id="box">Hallo<span>Welt</span></div> <Skripttyp="text/javascript"> let Beobachter = neuer MutationObserver( (Mutationsdatensätze) => console.log(Mutationsdatensätze) ); let box = document.getElementById("box"); Beobachter.beobachten(box, { Attribute: true, //Beobachten Sie die Änderungen des Teilbaums subtree: true }); // Änderungen im ID-Attribut des Span-Elements können beobachtet werden box.childNodes[1].id = "text"; // Konsolendruck: // [Mutationsdatensatz] </Skript> Nachdem Zusammenfassen:
Dies ist das Ende dieses Artikels über die Details der Überwachung von DOM-Elementen Das könnte Sie auch interessieren:
|
<<: Lösen Sie das Matching-Problem in CSS
>>: Methode zum Knacken der Registrierung der FlashFXP-FTP-Clientsoftware
Führen Sie den folgenden Befehl aus, um einen Feh...
Weiterleitung zwischen zwei verschiedenen Servern...
Denken Sie darüber nach: Warum sollte css im head...
1. Erstellen Sie eine Docker-Netzwerkkarte [root@...
Inhaltsverzeichnis 1. Betrieb von js Integer 2. S...
Inhaltsverzeichnis Komponenten zerlegen Linkes Fe...
Inhaltsverzeichnis Vorwort Zustand Docker install...
Ich habe kürzlich Bootstrap zum Entwickeln einer ...
Ziehen Sie das Bild root@EricZhou-MateBookProX: D...
Hier sind einige Möglichkeiten zum Entfernen: Füge...
1. Erstellen einfügen in [Tabellenname] (Feld1, F...
Frage: Was ist der Unterschied zwischen int(1) un...
Problem/Fehler/Szenario/Anforderung Die Festplatt...
Es gibt zwei Möglichkeiten: 1. Servicemethode Übe...
Heute möchte ich einen Countdown von Vue und Mome...