Signatur
Beschreibung
Die Eigenschaft updateRangeEnd des TextUpdateEvent gibt an, wo der zu ersetzende Textbereich endet. Das Event wird auf einem EditContext ausgelöst, sobald der Benutzer tippt, einfügt, löscht oder eine IME-Komposition (z. B. bei japanischer oder chinesischer Eingabe) den Text verändert.
Zusammen mit updateRangeStart beschreibt sie den halboffenen Bereich [updateRangeStart, updateRangeEnd) im bisherigen Text. Dieser Bereich soll durch den Inhalt von event.text ersetzt werden. Sind Start und Ende gleich, handelt es sich um eine reine Einfügung. Ist text leer, wird nur gelöscht.
Wichtig: Der EditContext hat seinen internen Text beim Auslösen des Events bereits aktualisiert. Die Aufgabe deines Codes ist es, das eigene Modell und die Darstellung (z. B. Canvas oder eigenes DOM) passend nachzuziehen. Genau dafür brauchst du updateRangeEnd, typischerweise zusammen mit String.prototype.slice().
Rückgabewert
Beispiele
Ersetzten Bereich protokollieren
const editor = document.querySelector('#editor');
const editContext = new EditContext();
editor.editContext = editContext;
editContext.addEventListener('textupdate', (event) => {
console.log(
`Ersetze [${event.updateRangeStart}, ${event.updateRangeEnd}) durch "${event.text}"`
);
});
Eigenes Textmodell synchron halten
let model = '';
const editor = document.querySelector('#editor');
const editContext = new EditContext();
editor.editContext = editContext;
editContext.addEventListener('textupdate', (event) => {
const { updateRangeStart: start, updateRangeEnd: end, text } = event;
// Bereich [start, end) durch den neuen Text ersetzen
model = model.slice(0, start) + text + model.slice(end);
editor.textContent = model;
console.log(model);
});
Einfügen, Ersetzen und Löschen unterscheiden
const editContext = new EditContext({ text: 'Hallo Welt' });
document.querySelector('#editor').editContext = editContext;
editContext.addEventListener('textupdate', (event) => {
const length = event.updateRangeEnd - event.updateRangeStart;
if (length === 0) {
console.log('Einfügung:', event.text);
} else if (event.text === '') {
console.log(`Löschung von ${length} Zeichen`);
} else {
console.log(`Ersetzung von ${length} Zeichen durch "${event.text}"`);
}
});
// Wichtig · Fallstricke
- Exklusives Ende: Das Zeichen an Position
updateRangeEndgehört nicht mehr zum ersetzten Bereich. Deshalb passt die Eigenschaft direkt zuslice(end). - UTF-16-Offsets: Emojis und andere Zeichen außerhalb der BMP belegen zwei Codeeinheiten. Wer mit Graphem- oder Codepoint-Indizes rechnet (z. B. über
Intl.SegmenteroderArray.from()), bekommt falsche Positionen. - Bezugspunkt ist der alte Text: Die Offsets beziehen sich auf den Text vor der Änderung. Wer mehrere Updates zwischenspeichert und verzögert anwendet, muss die Positionen selbst verschieben.
- Die Auswahl wird nicht automatisch angepasst: Nutze
selectionStart/selectionEnddes Events, um den Cursor in der eigenen Darstellung zu setzen. - Kompatibilität: Die EditContext API ist experimentell und bisher nur in Chromium-Browsern verfügbar (ab Version 121). Prüfe die Unterstützung mit
'EditContext' in windowund sieh eine Ersatzlösung vor, z. B.contenteditableoder<textarea>.