Signatur
Beschreibung
Die Eigenschaft type eines MutationRecord gibt an, welche Art von Änderung ein MutationObserver festgestellt hat. Sie ist schreibgeschützt und enthält immer genau einen der drei Werte "attributes", "characterData" oder "childList".
Meist ist type der erste Wert, den man im Callback eines MutationObserver prüft. Ein Beobachter bekommt oft mehrere Arten von Änderungen gleichzeitig gemeldet, deshalb unterscheidet man anhand von type, welche anderen Eigenschaften des Datensatzes überhaupt sinnvoll belegt sind:
"attributes": Ein Attribut vontargethat sich geändert.attributeName,attributeNamespaceund, fallsattributeOldValue: truegesetzt ist, aucholdValuesind belegt."characterData": Der Inhalt einesText-,Comment- oderProcessingInstruction-Knotens hat sich geändert.targetist dieser Knoten.oldValueist belegt, fallscharacterDataOldValue: truegesetzt ist."childList": Kindknoten wurden hinzugefügt oder entfernt.addedNodes,removedNodes,previousSiblingundnextSiblingsind belegt.
Welche Typen überhaupt gemeldet werden, legen die Optionen fest, die man an MutationObserver.prototype.observe() übergibt (attributes, characterData, childList, dazu subtree).
Rückgabewert
Beispiele
Mutationstypen im Callback unterscheiden
const container = document.createElement('div');
document.body.append(container);
const observer = new MutationObserver((records) => {
for (const record of records) {
switch (record.type) {
case 'childList':
console.log(`childList: +${record.addedNodes.length} / -${record.removedNodes.length}`);
break;
case 'attributes':
console.log(`attributes: ${record.attributeName} (alt: ${record.oldValue})`);
break;
case 'characterData':
console.log(`characterData: "${record.oldValue}" → "${record.target.data}"`);
break;
}
}
});
observer.observe(container, {
childList: true,
attributes: true,
attributeOldValue: true,
characterData: true,
characterDataOldValue: true,
subtree: true
});
const text = document.createTextNode('Hallo');
container.append(text);
container.className = 'aktiv';
text.data = 'Hallo Welt';
Nur neu eingefügte Elemente verarbeiten (z. B. Lazy-Init)
const initWidget = (el) => {
el.dataset.initialisiert = 'ja';
console.log('Widget initialisiert:', el.id);
};
const observer = new MutationObserver((records) => {
records
.filter((r) => r.type === 'childList')
.flatMap((r) => [...r.addedNodes])
.filter((node) => node instanceof Element && node.matches('.widget'))
.forEach(initWidget);
});
observer.observe(document.body, { childList: true, subtree: true });
const widget = document.createElement('div');
widget.className = 'widget';
widget.id = 'chart-1';
document.body.append(widget);
Änderungen nach Typ zählen mit takeRecords()
const el = document.createElement('p');
document.body.append(el);
const observer = new MutationObserver(() => {});
observer.observe(el, { attributes: true, childList: true });
el.title = 'Info';
el.append('Text');
el.setAttribute('lang', 'de');
// Noch nicht zugestellte Datensätze synchron abholen
const counts = observer.takeRecords().reduce((acc, r) => {
acc[r.type] = (acc[r.type] ?? 0) + 1;
return acc;
}, {});
console.log(counts);
observer.disconnect();
// Wichtig · Fallstricke
- Die Schreibweise ist genau festgelegt:
"characterData"mit großemD. Ein Vergleich mit"characterdata"trifft nie zu. - Der Typ
"childList"meldet nur direkte Kinder vontarget. Mitsubtree: trueisttargetjeweils der Elternknoten, der sich tatsächlich geändert hat, und nicht der beobachtete Wurzelknoten. - Ändert man
textContentoderinnerHTML, erzeugt das einen Datensatz vom Typ"childList"und keinen vom Typ"characterData", weil dabei Knoten ersetzt werden. Den Typ"characterData"lösen nur direkte Änderungen andataodernodeValueeines Textknotens aus. - Setzt man ein Attribut auf denselben Wert, entsteht trotzdem ein Datensatz vom Typ
"attributes". typeist schreibgeschützt. Eine Zuweisung wird ignoriert und wirft im Strict Mode einenTypeError.- Performance: Beobachtet man große Teilbäume mit
subtree: true, kann das sehr viele Datensätze erzeugen. Man sollte deshalb früh nachtypefiltern und im Callback keine teuren DOM-Abfragen ausführen. - Kompatibilität: Die Eigenschaft wird von allen aktuellen Browsern unterstützt. Der Internet Explorer unterstützt sie erst ab Version 11.