Signatur
Beschreibung
Die Eigenschaft endOffset der Schnittstelle AbstractRange gibt als ganze Zahl an, wo genau innerhalb des Endknotens (endContainer) ein Bereich endet. Sie wird von Range und StaticRange geerbt und ist schreibgeschützt.
Was der Wert bedeutet, hängt vom Typ des Endknotens ab:
- Ist
endContainereinText-,Comment- oderCDATASection-Knoten, istendOffsetdie Anzahl der Zeichen (genauer: UTF-16-Codeeinheiten) vom Anfang des Knotens bis zum Bereichsende. - Bei allen anderen Knoten (z. B. Elementen) ist
endOffsetdie Anzahl der Kindknoten zwischen dem Anfang vonendContainerund dem Bereichsende.
Gebraucht wird die Eigenschaft vor allem beim Auswerten von Textauswahlen (Selection.getRangeAt()), in Editoren, beim Hervorheben von Suchtreffern oder beim Auswerten von beforeinput-Events über getTargetRanges(). Zusammen mit startContainer, startOffset und endContainer legt sie einen Bereich im DOM eindeutig fest.
Rückgabewert
endContainer.Beispiele
Offset in einem Textknoten auslesen
const p = document.createElement('p');
p.textContent = 'Hallo Welt';
document.body.append(p);
const text = p.firstChild;
const range = document.createRange();
range.setStart(text, 0);
range.setEnd(text, 5); // Ende nach "Hallo"
console.log(range.endContainer === text);
console.log(range.endOffset);
console.log(range.toString());
Offset bei Element-Containern (Kindknoten-Index)
const ul = document.createElement('ul');
ul.innerHTML = '<li>A</li><li>B</li><li>C</li>';
document.body.append(ul);
const range = document.createRange();
range.selectNodeContents(ul);
console.log(range.endContainer === ul);
console.log(range.endOffset); // Anzahl der Kindknoten
range.setEnd(ul, 2); // Ende vor dem dritten <li>
console.log(range.toString());
Benutzerauswahl auswerten
document.addEventListener('mouseup', () => {
const selection = window.getSelection();
if (!selection || selection.rangeCount === 0) return;
const range = selection.getRangeAt(0);
console.log('Endknoten:', range.endContainer.nodeName);
console.log('Endoffset:', range.endOffset);
console.log('Ausgewählt:', JSON.stringify(range.toString()));
});
StaticRange aus beforeinput-Event
const editor = document.querySelector('[contenteditable]');
editor.addEventListener('beforeinput', (event) => {
for (const r of event.getTargetRanges()) {
// r ist ein StaticRange und erbt endOffset von AbstractRange
console.log(`${event.inputType}: ${r.startOffset}–${r.endOffset}`);
}
});
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
range.endOffset = 3hat keine Wirkung (im Strict Mode gibt es einenTypeError). Zum Ändern verwendet manRange.setEnd(),setEndBefore()odersetEndAfter(). - Zeichen- oder Knotenindex: Der Wert wird unterschiedlich gedeutet, je nachdem ob
endContainerein Textknoten oder ein Element ist. Vor dem Rechnen immerendContainer.nodeTypeprüfen. - UTF-16: Bei Textknoten werden Codeeinheiten gezählt, nicht sichtbare Zeichen. Emojis oder Zeichen außerhalb der BMP zählen als 2.
- StaticRange: Bei
StaticRangewird der Wert bei DOM-Änderungen nicht angepasst und kann danach ungültig sein, also größer als die aktuelle Länge des Knotens.Rangepasst sich dagegen automatisch an. - Kompatibilität:
Range.endOffsetgibt es in allen Browsern schon sehr lange. Die gemeinsame BasisschnittstelleAbstractRangeist erst seit etwa 2020 in Chrome, Firefox und Safari verfügbar.