Start · Sprachen · JavaScript · Referenz · TextUpdateEvent.selectionStart

TextUpdateEvent.selectionStart

Eigenschaft

Schreibgeschützte Zahl: Position des Auswahlanfangs bzw. des Cursors im Text des <code>EditContext</code> nach dem Text-Update.

seit JavaScript Experimentell: Chrome/Edge 121+, nicht in Firefox Kategorie: webapi

Signatur

TextUpdateEvent.selectionStart

Beschreibung

Die schreibgeschützte Eigenschaft selectionStart des TextUpdateEvent gibt an, an welcher Stelle die Auswahl (oder der Cursor) im Textinhalt des bearbeitbaren Bereichs nach der Textänderung beginnt. Der bearbeitbare Bereich ist mit einem EditContext-Objekt verknüpft.

Das Ereignis textupdate wird ausgelöst, wenn der Benutzer tippt oder eine Eingabemethode (IME) Text einfügt. Mit der EditContext-API übernimmt deine Anwendung selbst das Darstellen von Text und Cursor, z. B. in einem <canvas>-basierten Editor. Deshalb musst du nach jedem Update die neue Cursorposition aus selectionStart und selectionEnd auslesen und in deinem eigenen Zustand übernehmen.

Der Wert ist ein Offset in UTF-16-Codeeinheiten, gezählt ab dem Anfang von editContext.text. Sind selectionStart und selectionEnd gleich, gibt es keine Auswahl, sondern nur einen einfachen Cursor. Nach normaler Texteingabe trifft das meistens zu.

Rückgabewert

Typ
number
Beschreibung
Offset des Auswahlanfangs (UTF-16-Codeeinheiten) im Text des EditContext, gültig nach dem Update.

Beispiele

Cursorposition nach Eingabe ausgeben

const editor = document.getElementById('editor');
const editContext = new EditContext();
editor.editContext = editContext;

editContext.addEventListener('textupdate', (event) => {
  console.log(`Eingefügt: "${event.text}"`);
  console.log(`Auswahl: ${event.selectionStart}–${event.selectionEnd}`);
});
Eingefügt: "a" Auswahl: 1–1

Eigenen Editor-Zustand aktualisieren und rendern

const canvas = document.querySelector('canvas');
const ctx2d = canvas.getContext('2d');
const editContext = new EditContext();
canvas.editContext = editContext;

const state = { text: '', selStart: 0, selEnd: 0 };

const render = () => {
  ctx2d.clearRect(0, 0, canvas.width, canvas.height);
  ctx2d.font = '16px sans-serif';
  ctx2d.fillText(state.text, 10, 30);
  // Cursor an selStart zeichnen
  const x = 10 + ctx2d.measureText(state.text.slice(0, state.selStart)).width;
  ctx2d.fillRect(x, 14, 1, 20);
};

editContext.addEventListener('textupdate', (e) => {
  state.text = editContext.text;
  state.selStart = e.selectionStart;
  state.selEnd = e.selectionEnd;
  render();
});

Feature-Erkennung und Unterscheidung Cursor/Auswahl

if ('EditContext' in window) {
  const el = document.querySelector('#editor');
  el.editContext = new EditContext({ text: 'Hallo' });
  el.editContext.addEventListener('textupdate', ({ selectionStart, selectionEnd }) => {
    const collapsed = selectionStart === selectionEnd;
    console.log(collapsed ? `Cursor bei ${selectionStart}` : 'Auswahl aktiv');
  });
} else {
  console.warn('EditContext wird nicht unterstützt – Fallback auf contenteditable.');
}
Cursor bei 6

// Wichtig · Fallstricke

  • Experimentell: Die EditContext-API gibt es bisher nur in Chromium-Browsern (Chrome/Edge ab 121). Prüfe vorher mit 'EditContext' in window, ob sie verfügbar ist.
  • Nicht verwechseln mit updateRangeStart. Diese Eigenschaft gibt an, ab welcher Stelle Text ersetzt wurde. selectionStart ist dagegen die Cursorposition nach dem Update.
  • Der Offset zählt UTF-16-Codeeinheiten. Emojis und andere Zeichen außerhalb der BMP belegen zwei Einheiten. Rechne diese Werte also nicht direkt in Graphem-Indizes um.
  • Die Eigenschaft ist schreibgeschützt. Die Auswahl änderst du mit EditContext.updateSelection().
  • Den Text liest du aus editContext.text aus, denn das DOM-Element wird nicht automatisch aktualisiert.