Start · Sprachen · JavaScript · Referenz · CharacterData.length

CharacterData.length

Eigenschaft

Gibt die Länge der Daten eines <code>Text</code>-, <code>Comment</code>-, <code>CDATASection</code>- oder <code>ProcessingInstruction</code>-Knotens in UTF-16-Codeeinheiten zurück (schreibgeschützt).

seit JavaScript DOM Level 1 – Baseline: alle Browser Kategorie: webapi

Signatur

get CharacterData.length

Beschreibung

Die schreibgeschützte Eigenschaft length des Interfaces CharacterData gibt an, wie viele Zeichen im Inhalt eines zeichenbasierten Knotens stehen. Der Wert entspricht immer node.data.length. Er ist eine nicht-negative ganze Zahl, bei einem leeren Knoten also 0.

CharacterData ist ein abstraktes Interface. In der Praxis nutzt du length deshalb über die abgeleiteten Knotentypen Text, Comment, CDATASection und ProcessingInstruction. Häufig brauchst du die Eigenschaft zusammen mit den Methoden, die mit Positionen arbeiten: substringData(), insertData(), deleteData(), replaceData() und Text.splitText(). Auch bei der Arbeit mit Range und Selection ist sie nützlich, etwa um mit range.setEnd(textNode, textNode.length) das Ende eines Textknotens anzusteuern.

Wichtig: Gezählt werden UTF-16-Codeeinheiten, keine sichtbaren Zeichen (Grapheme). Emojis und andere Zeichen außerhalb der Basic Multilingual Plane zählen als 2. Kombinierte Zeichen wie e plus ein kombinierender Akzent zählen ebenfalls mehrfach.

Rückgabewert

Typ
number
Beschreibung
Anzahl der UTF-16-Codeeinheiten in data, eine nicht-negative ganze Zahl (unsigned long).

Beispiele

Länge eines Textknotens und eines Kommentars ermitteln

const text = document.createTextNode('Hallo Welt');
const comment = document.createComment(' TODO ');

console.log(text.length);    // 10
console.log(comment.length); // 6
console.log(document.createTextNode('').length); // 0
10 6 0

Fallstrick: Emojis und Surrogatpaare

const node = document.createTextNode('Hi 😀');

console.log(node.length);            // 5 (Emoji = 2 Codeeinheiten)
console.log([...node.data].length);  // 4 (Codepoints)

// Grapheme korrekt zählen
const seg = new Intl.Segmenter('de', { granularity: 'grapheme' });
console.log([...seg.segment(node.data)].length); // 4
5 4 4

Cursor ans Ende eines Textknotens setzen

const p = document.createElement('p');
p.contentEditable = 'true';
p.textContent = 'Bearbeite mich';
document.body.append(p);

const textNode = p.firstChild;
const range = document.createRange();
range.setStart(textNode, textNode.length);
range.collapse(true);

const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
p.focus();
console.log(`Cursor bei Offset ${textNode.length}`);
Cursor bei Offset 14

Mit length sicher Teilstrings und Aufteilungen berechnen

const node = document.createTextNode('Überschrift: Einleitung');
const mitte = Math.floor(node.length / 2);

// Letzte 10 Codeeinheiten auslesen
console.log(node.substringData(node.length - 10, 10)); // 'Einleitung'

// Knoten in der Mitte teilen
const rest = node.splitText(mitte);
console.log(node.length, rest.length); // 11 12
Einleitung 11 12

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie node.length = 3 wird im nicht-strikten Modus stillschweigend ignoriert und löst im Strict Mode einen TypeError aus. Kürzen kannst du den Inhalt mit deleteData() oder über data.
  • UTF-16: Offsets für substringData() & Co. werden ebenfalls in Codeeinheiten angegeben. Wenn du mitten in einem Surrogatpaar trennst, entstehen ungültige Zeichen. Zum Zählen sichtbarer Zeichen nimm Intl.Segmenter.
  • Offsets außerhalb des Bereichs: Ein Offset größer als length in substringData(), insertData() oder splitText() löst eine DOMException (IndexSizeError) aus.
  • Nur ein Knoten: length bezieht sich nur auf den einen Knoten. Für den gesamten Text eines Elements verwende element.textContent.length. Leerraum-Textknoten aus der HTML-Formatierung werden mitgezählt.
  • Kompatibilität: Wird seit DOM Level 1 von allen Browsern unterstützt, auch in jsdom und ähnlichen DOM-Umgebungen unter Node.js.