Signatur
Beschreibung
oldValue ist eine schreibgeschützte Eigenschaft eines MutationRecord, den ein MutationObserver an seine Callback-Funktion übergibt. Sie enthält den Zustand vor der Änderung. So lässt sich ein Vorher-Nachher-Vergleich machen, ohne dass man den alten Zustand selbst zwischenspeichern muss.
Welchen Inhalt die Eigenschaft hat, hängt vom type des Datensatzes ab:
"attributes": der vorherige Wert des geänderten Attributs (attributeName). War das Attribut vorher nicht vorhanden, steht hiernull."characterData": der vorherige Text desText-,Comment- oderCDATASection-Knotens."childList": immernull.
Ganz wichtig: Der Wert wird nur dann erfasst, wenn man ihn ausdrücklich anfordert. Dazu setzt man beim Aufruf von observe() die Option attributeOldValue: true bzw. characterDataOldValue: true. Ohne diese Optionen ist oldValue immer null. Den aktuellen Wert liest man dagegen direkt vom Zielknoten (record.target) aus, zum Beispiel über getAttribute() oder data.
Rückgabewert
null gibt es bei childList-Datensätzen, wenn die passende *OldValue-Option fehlt oder wenn ein Attribut vorher nicht vorhanden war.Beispiele
Attributänderung mit Vorher-/Nachher-Wert protokollieren
const box = document.createElement('div');
box.className = 'klein';
document.body.append(box);
const observer = new MutationObserver((records) => {
for (const record of records) {
if (record.type === 'attributes') {
const neu = record.target.getAttribute(record.attributeName);
console.log(`${record.attributeName}: "${record.oldValue}" → "${neu}"`);
}
}
});
// attributeOldValue ist nötig, sonst ist oldValue null
observer.observe(box, { attributes: true, attributeOldValue: true });
box.className = 'gross';
Textänderungen in einem editierbaren Bereich verfolgen
const editor = document.createElement('p');
editor.textContent = 'Hallo';
document.body.append(editor);
const textNode = editor.firstChild;
const observer = new MutationObserver((records) => {
records.forEach(({ type, oldValue, target }) => {
if (type === 'characterData') {
console.log('Vorher:', oldValue, '| Nachher:', target.data);
}
});
});
observer.observe(editor, {
characterData: true,
characterDataOldValue: true,
subtree: true // Textknoten sind Kinder von <p>
});
textNode.data = 'Hallo Welt';
Neu hinzugefügte Attribute erkennen (oldValue === null)
const button = document.createElement('button');
document.body.append(button);
const observer = new MutationObserver((records) => {
for (const r of records) {
if (r.oldValue === null) {
console.log(`Attribut "${r.attributeName}" wurde neu gesetzt`);
} else if (!r.target.hasAttribute(r.attributeName)) {
console.log(`Attribut "${r.attributeName}" entfernt (war "${r.oldValue}")`);
}
}
});
observer.observe(button, {
attributeFilter: ['disabled', 'aria-busy'],
attributeOldValue: true
});
button.setAttribute('disabled', '');
button.setAttribute('aria-busy', 'true');
button.removeAttribute('aria-busy');
// Wichtig · Fallstricke
- Häufigster Fehler:
oldValueist immernull, wenn manattributeOldValue: truebzw.characterDataOldValue: truenicht setzt. Setzt man eine dieser Optionen, geltenattributesbzw.characterDataautomatisch alstrue. nullkann zweierlei heißen: Das Attribut war vorher nicht vorhanden, oderoldValuewurde nicht angefordert. Ein vorher leeres Attribut (z. B.disabled="") liefert dagegen"".- Die Callback-Funktion wird gesammelt als Mikrotask aufgerufen. Bei mehreren Änderungen hintereinander bekommt jede Änderung einen eigenen Datensatz mit ihrem jeweiligen Vorher-Wert.
record.targetzeigt aber schon den endgültigen Zustand. Den genauen Zwischenwert erhält man nur aus demoldValuedes jeweils nächsten Datensatzes. - Auch das Setzen desselben Werts (z. B.
el.className = el.className) erzeugt einen Datensatz, bei demoldValuegleich dem neuen Wert ist. - Wird in einem
MutationObserverein Attribut des beobachteten Elements geändert, kann eine Endlosschleife entstehen. Deshalb vorher den Wert vergleichen oder den Observer mitdisconnect()vorübergehend trennen. - Die Eigenschaft wird von allen modernen Browsern unterstützt. In Node.js gibt es sie nur über DOM-Implementierungen wie jsdom.