Signatur
Beschreibung
Das Ereignis compositionstart wird ausgelöst, wenn der Nutzer mit einem Input-Method-Editor (IME) anfängt, Text zusammenzusetzen. Das passiert zum Beispiel bei der Eingabe von Chinesisch, Japanisch oder Koreanisch, bei Akzentzeichen über Tottasten (etwa ´ + e → é) sowie bei Spracheingabe oder Handschrift auf Mobilgeräten. Die Sitzung läuft danach über compositionupdate weiter und endet mit compositionend.
Man nutzt das Ereignis vor allem, um Logik während der Komposition auszusetzen. Dazu gehören Live-Suche, Autovervollständigung, Eingabevalidierung und Tastenkürzel wie „Enter sendet“. Solange die Komposition läuft, ist der Text im Feld nur vorläufig. Wer ihn in dieser Phase verarbeitet, bekommt halbfertige Zeichenfolgen.
Das Ereignisobjekt ist ein CompositionEvent. Seine Eigenschaft data enthält bei compositionstart den Text, den die Komposition ersetzen wird, also die aktuelle Auswahl. Ohne Auswahl ist sie meist ein leerer String. Das Ereignis steigt im DOM auf (bubbles: true), lässt sich aber laut Spezifikation nicht abbrechen. Es gibt auch die Handler-Eigenschaft oncompositionstart, allerdings nicht in jedem Browser (siehe Hinweise). Deshalb ist addEventListener der empfohlene Weg.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "compositionstart". |
|
| $handler Pflicht | (event: CompositionEvent) => void | Die Callback-Funktion. Sie erhält ein CompositionEvent mit den Eigenschaften data (der zu ersetzende Text) und locale (veraltet). |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Einstellungen wie capture, once, passive oder signal. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein CompositionEvent.Beispiele
Kompositionsbeginn protokollieren
const input = document.querySelector('#name');
input.addEventListener('compositionstart', (event) => {
console.log('Komposition gestartet, ersetzt:', JSON.stringify(event.data));
});
input.addEventListener('compositionend', (event) => {
console.log('Komposition beendet, Ergebnis:', event.data);
});
Live-Suche während der IME-Eingabe pausieren
const search = document.querySelector('#search');
let composing = false;
const runSearch = (term) => console.log('Suche nach:', term);
search.addEventListener('compositionstart', () => {
composing = true;
});
search.addEventListener('compositionend', (event) => {
composing = false;
runSearch(event.target.value); // erst jetzt ist der Text endgültig
});
search.addEventListener('input', (event) => {
// event.isComposing wird zusätzlich geprüft, weil es der verlässlichere Weg ist
if (composing || event.isComposing) return;
runSearch(event.target.value);
});
Enter zum Senden – aber nicht beim Bestätigen im IME
const chat = document.querySelector('#chat-input');
const send = (text) => console.log('Gesendet:', text);
chat.addEventListener('keydown', (event) => {
// Enter bestätigt während einer Komposition nur die IME-Auswahl
if (event.key === 'Enter' && !event.isComposing && event.keyCode !== 229) {
event.preventDefault();
send(chat.value);
chat.value = '';
}
});
chat.addEventListener('compositionstart', () => {
chat.classList.add('is-composing');
});
chat.addEventListener('compositionend', () => {
chat.classList.remove('is-composing');
});
Handler über oncompositionstart setzen und entfernen
const field = document.querySelector('textarea');
const onStart = () => console.log('IME aktiv');
// Variante 1: addEventListener / removeEventListener
field.addEventListener('compositionstart', onStart);
field.removeEventListener('compositionstart', onStart);
// Variante 2: Handler-Eigenschaft (nicht in jedem Browser vorhanden)
if ('oncompositionstart' in field) {
field.oncompositionstart = onStart;
field.oncompositionstart = null; // wieder entfernen
}
// Wichtig · Fallstricke
- Nicht abbrechbar:
event.preventDefault()incompositionstartverhindert die Komposition nicht. Den IME kann man nicht per Skript blockieren. - Handler-Eigenschaft:
oncompositionstartfehlt in manchen Browsern als Attribut bzw. Eigenschaft (in Chrome und Edge etwa ist sie nicht vorhanden). Verwenden Sie daheraddEventListener. - Reihenfolge der Ereignisse ist uneinheitlich: Chrome und Safari feuern
inputauch während der Komposition, mitisComposing: true. Die Reihenfolge voncompositionendund dem letzteninputunterscheidet sich zwischen den Browsern. Prüfen Sie am besten sowohlevent.isComposingals auch ein eigenes Flag. - Safari/Enter-Falle: In Safari kann
keydownfür die bestätigende Enter-Taste nachcompositionendkommen, sodassisComposingdannfalseist. Zusätzlich aufkeyCode === 229zu prüfen, ist ein verbreiteter Workaround. - Mobilgeräte: Android-Tastaturen mit Wortvorschlägen starten oft auch bei lateinischer Schrift eine Komposition, teils schon für jedes Wort. Code, der Eingaben während einer Komposition ignoriert, muss auf
compositionendreagieren, sonst verarbeitet er dort gar keine Eingaben. - Das Ereignis tritt nur bei bearbeitbaren Elementen auf (
<input>,<textarea>,contenteditable).