Start · Sprachen · JavaScript · Referenz · CompositionEvent

CompositionEvent

Schnittstelle

Beschreibt Ereignisse bei indirekter Texteingabe über einen Eingabemethoden-Editor (IME), zum Beispiel für Chinesisch, Japanisch, Koreanisch oder bei Sprach- und Handschrifteingabe.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

interface CompositionEvent extends UIEvent

Beschreibung

CompositionEvent steht für Ereignisse, die ausgelöst werden, wenn jemand Text nicht direkt Zeichen für Zeichen eintippt, sondern schrittweise über einen Eingabemethoden-Editor (IME) zusammensetzt. Typische Fälle sind japanische, chinesische oder koreanische Tastaturen, Tottasten für Akzentzeichen (etwa ´ + e → é), Sprach- und Handschrifteingabe sowie manche mobilen Tastaturen mit Wortvorschlägen.

Zum Interface gehören drei Ereignistypen:

  • compositionstart: Eine neue Komposition beginnt.
  • compositionupdate: Ein Zeichen wurde zur laufenden Komposition hinzugefügt oder daraus entfernt.
  • compositionend: Die Komposition ist abgeschlossen oder wurde abgebrochen.

Die wichtigste Eigenschaft ist data. Sie enthält den aktuell zusammengesetzten Text. Bei compositionend ist das der endgültig übernommene Text. Über die veraltete Eigenschaft locale ließ sich früher die Sprache der Eingabemethode abfragen. Von UIEvent und Event erbt das Interface Eigenschaften wie view, detail, target und type.

In der Praxis braucht man CompositionEvent vor allem, damit Live-Suche, Autovervollständigung, Zeichenzähler oder Tastenkürzel nicht mitten in einer IME-Eingabe auslösen. Solange eine Komposition läuft, ist der Text im Feld nur ein Zwischenstand. Mit InputEvent.isComposing oder KeyboardEvent.isComposing lässt sich außerdem prüfen, ob gerade eine Komposition aktiv ist.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Name des Ereignisses beim Konstruktoraufruf new CompositionEvent(type, options): "compositionstart", "compositionupdate" oder "compositionend".
$options object {} Optionales Wörterbuch (CompositionEventInit). Neben den UIEventInit-Feldern (bubbles, cancelable, composed, view, detail) gibt es data (string, Standard "") mit dem Anfangswert der Eigenschaft data.

Rückgabewert

Typ
CompositionEvent
Beschreibung
Ein neues CompositionEvent-Objekt. Die schreibgeschützte Eigenschaft data (string) enthält den zusammengesetzten Text.

Beispiele

Kompositionsphasen protokollieren

const input = document.querySelector('#name');

const log = (event) => {
  // event ist ein CompositionEvent
  console.log(`${event.type}: "${event.data}"`);
};

input.addEventListener('compositionstart', log);
input.addEventListener('compositionupdate', log);
input.addEventListener('compositionend', log);
// Japanische IME, Eingabe "nihon" → 日本: compositionstart: "" compositionupdate: "n" compositionupdate: "に" ... compositionupdate: "日本" compositionend: "日本"

Live-Suche erst nach abgeschlossener IME-Eingabe starten

const search = document.querySelector('#search');
let composing = false;

const runSearch = async (term) => {
  if (!term.trim()) return;
  const res = await fetch(`/api/search?q=${encodeURIComponent(term)}`);
  const hits = await res.json();
  console.log(`${hits.length} Treffer für "${term}"`);
};

search.addEventListener('compositionstart', () => { composing = true; });

search.addEventListener('compositionend', (event) => {
  composing = false;
  // Endgültigen Text übernehmen
  runSearch(search.value);
});

search.addEventListener('input', (event) => {
  // Zwischenstände der IME ignorieren
  if (composing || event.isComposing) return;
  runSearch(search.value);
});
3 Treffer für "東京"

Enter-Taste während der Komposition nicht als Absenden werten

const chat = document.querySelector('#chat-input');

chat.addEventListener('keydown', (event) => {
  // Enter bestätigt bei aktiver IME nur die Zeichenauswahl
  if (event.key === 'Enter' && !event.isComposing && event.keyCode !== 229) {
    event.preventDefault();
    console.log('Nachricht senden:', chat.value);
    chat.value = '';
  }
});
Nachricht senden: こんにちは

CompositionEvent synthetisch erzeugen (z. B. für Tests)

const field = document.createElement('input');

field.addEventListener('compositionend', (e) => {
  console.log(e instanceof CompositionEvent, e.data);
});

const event = new CompositionEvent('compositionend', {
  data: 'Grüße',
  bubbles: true
});
field.dispatchEvent(event);
true Grüße

// Wichtig · Fallstricke

  • Reihenfolge der Ereignisse: Sie ist nicht in allen Browsern gleich. In Chrome und Edge kommt das letzte input-Ereignis meist vor compositionend. Safari kann compositionend vor dem zugehörigen keydown auslösen. Verlassen Sie sich deshalb nicht allein auf ein einzelnes Flag, sondern prüfen Sie zusätzlich event.isComposing.
  • Safari und Enter: Bei Safari ist isComposing im keydown der bestätigenden Enter-Taste oft schon false. Die zusätzliche Prüfung auf keyCode === 229 ist deshalb ein verbreiteter Ausweg. keyCode ist allerdings veraltet.
  • Nicht abbrechbar: compositionupdate und compositionend sind nicht abbrechbar. Ob preventDefault() bei compositionstart wirkt, hängt vom Browser ab. Eine IME-Eingabe lässt sich damit also nicht zuverlässig unterbinden. Zum Filtern eignet sich eher beforeinput.
  • Veraltet: locale und initCompositionEvent() sind veraltet. Nutzen Sie stattdessen den Konstruktor new CompositionEvent().
  • Nur in bearbeitbaren Elementen: Die Ereignisse treten nur in <input>, <textarea> und bei contenteditable auf.
  • Synthetische Ereignisse: Selbst erzeugte Ereignisse (isTrusted === false) ändern den Feldinhalt nicht. Sie lösen nur die registrierten Handler aus.
  • Kompatibilität: In allen aktuellen Browsern verfügbar. Auf mobilen Tastaturen, etwa Android mit Wortvorschlägen, können Kompositionsereignisse auch bei lateinischer Schrift auftreten.