Signatur
Beschreibung
CharacterData ist ein abstraktes Interface. Man erzeugt davon nie direkt ein Objekt, sondern arbeitet mit den abgeleiteten Typen Text, Comment, CDATASection und ProcessingInstruction. Es erbt von Node und stellt die gemeinsamen Eigenschaften und Methoden bereit, mit denen man den Textinhalt eines solchen Knotens liest und gezielt ändert.
Die wichtigsten Mitglieder sind:
- Eigenschaften:
data(der Textinhalt, lesbar und schreibbar),length(Anzahl der UTF-16-Codeeinheiten, nur lesbar),nextElementSiblingundpreviousElementSibling(das benachbarte Element). - Methoden zur Textbearbeitung:
appendData(data),insertData(offset, data),deleteData(offset, count),replaceData(offset, count, data)undsubstringData(offset, count). - Methoden aus
ChildNode:before(...nodes),after(...nodes),replaceWith(...nodes)undremove().
Das Interface ist nützlich, wenn Text innerhalb eines Knotens geändert werden soll, ohne den Knoten neu zu erzeugen. Das ist etwa bei Hervorhebungen, bei Live-Zählern oder bei Editoren wichtig, denn Referenzen, Range-Objekte und die Cursor-Position bleiben dabei erhalten. Die Änderungen lösen bei einem MutationObserver Einträge vom Typ characterData aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $offset Pflicht | number | Position in UTF-16-Codeeinheiten, ab der gearbeitet wird. Gilt für insertData, deleteData, replaceData und substringData. Ist der Wert größer als length, wird ein IndexSizeError ausgelöst. |
|
| $count Pflicht | number | Anzahl der Codeeinheiten, die gelöscht, ersetzt oder gelesen werden. Reicht der Bereich über das Ende hinaus, wird er auf das Ende gekürzt. | |
| $data Pflicht | string | Text, der angehängt, eingefügt oder als Ersatz verwendet wird. Gilt für appendData, insertData und replaceData. |
Rückgabewert
substringData() gibt den gelesenen Teilstring zurück. Die übrigen Methoden zum Ändern (appendData, insertData, deleteData, replaceData) geben undefined zurück.Beispiele
Instanzen über abgeleitete Typen erzeugen
const text = document.createTextNode('Hallo');
const kommentar = document.createComment(' Build 42 ');
console.log(text instanceof CharacterData); // true
console.log(kommentar instanceof CharacterData); // true
console.log(text.data, text.length);
// Direkt instanziieren geht nicht:
try {
new CharacterData();
} catch (e) {
console.log(e.name);
}
Text im Knoten gezielt bearbeiten
const node = document.createTextNode('Preis: 10 EUR');
node.replaceData(7, 2, '12'); // '10' → '12'
node.insertData(0, '» ');
node.appendData(' (inkl. MwSt.)');
console.log(node.data);
console.log(node.substringData(9, 6));
node.deleteData(0, 2);
console.log(node.data);
Live-Zähler ohne neuen DOM-Knoten
const status = document.createElement('p');
status.textContent = 'Ungelesen: 0';
document.body.append(status);
const textNode = status.firstChild; // Text-Knoten
let count = 0;
const tick = () => {
count += 1;
// Nur den Zahlenanteil ersetzen – der Knoten bleibt derselbe
textNode.replaceData(11, textNode.length - 11, String(count));
};
tick();
tick();
console.log(textNode.data);
Änderungen mit MutationObserver beobachten
const p = document.createElement('p');
p.textContent = 'Entwurf';
document.body.append(p);
const observer = new MutationObserver((records) => {
for (const r of records) {
console.log(r.type, JSON.stringify(r.oldValue), '→', JSON.stringify(r.target.data));
}
});
observer.observe(p, { characterData: true, characterDataOldValue: true, subtree: true });
p.firstChild.appendData(' v2');
// Wichtig · Fallstricke
- Offsets zählen UTF-16-Codeeinheiten, nicht Zeichen. Emojis und andere Zeichen außerhalb der BMP belegen 2 Einheiten. Mit
deleteDataodersubstringDatakann man daher ein Surrogatpaar zerteilen und erhält so ungültigen Text. - Ein
offsetgrößer alslengthlöst eineDOMExceptionvom TypIndexSizeErroraus. Ein zu großescountwird dagegen stillschweigend gekürzt. - Auch
nullals Wert vondatawird zu einem leeren String.textContentundnodeValueverhalten sich bei diesen Knoten genauso wiedata. - Zeichendaten werden immer als reiner Text behandelt und nie als HTML interpretiert. Das ist eine sichere Alternative zu
innerHTML, wenn Benutzereingaben angezeigt werden sollen (kein XSS-Risiko). - Browser-Kompatibilität: Die Kernmethoden werden überall unterstützt.
before,after,replaceWithundremovegibt es erst in modernen Browsern, nicht im Internet Explorer. CDATASectiongibt es nur in XML-Dokumenten. In HTML-Dokumenten löstcreateCDATASection()einenNotSupportedErroraus.