Signatur
Beschreibung
insertData() ist eine Methode der Schnittstelle CharacterData. Diese Schnittstelle ist die gemeinsame Basis von Text, Comment, CDATASection und ProcessingInstruction. Die Methode fügt den übergebenen String data an der Position offset in die bestehenden Zeichendaten des Knotens ein. Der Text, der bisher ab dieser Position stand, rückt nach hinten.
Anders als eine Neuzuweisung über node.data = … oder textContent ändert insertData() den Knoten an Ort und Stelle. Der Knoten bleibt dasselbe Objekt, und aktive Range-Objekte sowie die Auswahl (Selection) werden laut DOM-Spezifikation automatisch an die neuen Positionen angepasst. Das ist nützlich für Editoren, Syntax-Hervorhebung oder Textbausteine, bei denen Cursor und Markierungen erhalten bleiben sollen.
Intern entspricht der Aufruf replaceData(offset, 0, data). Für einen MutationObserver mit characterData: true entsteht dabei genau ein Mutationsdatensatz vom Typ "characterData".
Wichtig: offset zählt UTF-16-Codeeinheiten, keine sichtbaren Zeichen. Emojis und andere Zeichen außerhalb der Basic Multilingual Plane belegen zwei Einheiten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $offset Pflicht | number (unsigned long) | Position in UTF-16-Codeeinheiten, an der eingefügt wird. 0 fügt am Anfang ein, node.length am Ende. Ist der Wert größer als node.length, wird ein IndexSizeError geworfen. |
|
| $data Pflicht | string | Der einzufügende Text. Andere Werte werden in einen String umgewandelt (z. B. 42 → "42"). HTML-Markup wird nicht interpretiert, sondern als reiner Text eingefügt. |
Rückgabewert
Beispiele
Text in einen Textknoten einfügen
const p = document.createElement('p');
p.textContent = 'Hallo Welt!';
const textNode = p.firstChild;
// Nach "Hallo " (6 Codeeinheiten) einfügen
textNode.insertData(6, 'schöne ');
console.log(textNode.data);
// Am Ende anhängen
textNode.insertData(textNode.length, ' 👋');
console.log(p.textContent);
Kommentarknoten erweitern
const comment = document.createComment('Build: ');
document.body.append(comment);
comment.insertData(comment.length, new Date(0).toISOString().slice(0, 10));
console.log(comment.data);
console.log(document.body.lastChild.nodeType === Node.COMMENT_NODE);
Fehlerbehandlung bei ungültigem Offset
const node = document.createTextNode('abc');
try {
node.insertData(10, 'x'); // 10 > node.length (3)
} catch (err) {
console.log(err.name);
}
// Negative Werte werden zu riesigen unsigned-Zahlen umgewandelt
try {
node.insertData(-1, 'x');
} catch (err) {
console.log(err.name);
}
Änderungen mit MutationObserver beobachten
const span = document.createElement('span');
span.textContent = 'Preis: EUR';
document.body.append(span);
const text = span.firstChild;
const observer = new MutationObserver((records) => {
for (const r of records) {
console.log(r.type, '| alt:', r.oldValue, '| neu:', r.target.data);
}
observer.disconnect();
});
observer.observe(text, { characterData: true, characterDataOldValue: true });
text.insertData(7, '19,99 ');
// Wichtig · Fallstricke
- UTF-16-Offsets:
'😀a'.lengthist3. MitinsertData(1, 'x')teilst du das Surrogat-Paar des Emojis und erzeugst ungültigen Text. Bei Unicode-lastigem Inhalt solltest du Positionen deshalb z. B. überIntl.Segmenteroder[...str]berechnen. - IndexSizeError: Wird geworfen, wenn
offset > lengthist. Negative Werte werden per WebIDL inunsigned longumgewandelt (aus-1wird4294967295) und lösen deshalb ebenfalls diesen Fehler aus. - Kein HTML: Der eingefügte String wird immer als Text behandelt. Die Methode ist daher XSS-sicher, anders als
innerHTML. Wenn du Markup brauchst, verwendeinsertAdjacentHTML()oder erzeuge Elemente. - Die Methode gibt es nur auf
CharacterData-Knoten. Auf Elementen führt der Aufruf zu einemTypeError. Den Textknoten erreichst du z. B. überelement.firstChild. - Browser-Kompatibilität: Die Methode wird seit DOM Level 1 in allen Browsern unterstützt und funktioniert auch in DOM-Implementierungen wie jsdom.