Signatur
Beschreibung
Die schreibgeschützte Eigenschaft data eines CompositionEvent enthält den Text, den eine Eingabemethode (Input Method Editor, IME) gerade erzeugt. Das betrifft etwa die Eingabe chinesischer, japanischer oder koreanischer Schriftzeichen, Bildschirmtastaturen auf Mobilgeräten mit Wortvorschlägen, Spracheingabe oder das Zusammensetzen von Akzentzeichen mit Tottasten.
Was in data steht, hängt vom Ereignistyp ab:
compositionstart: der Text, der beim Start der Komposition markiert ist und ersetzt wird – meist ein leerer String.compositionupdate: der aktuelle, noch nicht bestätigte Kompositionstext (z. B."にほ"während der Eingabe von „nihon“).compositionend: der endgültig bestätigte Text, der ins Eingabefeld übernommen wird (z. B."日本"), oder ein leerer String, wenn die Komposition abgebrochen wurde.
In der Praxis braucht man data vor allem dann, wenn Eingaben in Echtzeit verarbeitet werden – Live-Suche, Zeichenzähler, Autovervollständigung oder eigene Editoren. Solche Logik sollte während einer laufenden Komposition pausieren und erst bei compositionend mit dem bestätigten Text aus data weiterarbeiten. So vermeidet man, dass unfertige Zwischenstände (etwa lateinische Umschrift oder halbe Hangul-Silben) Suchanfragen oder Validierungen auslösen.
Rückgabewert
compositionstart oder bei abgebrochener Komposition).Beispiele
Kompositionsphasen protokollieren
const input = document.querySelector('#eingabe');
const log = (event) => {
console.log(`${event.type}: "${event.data}"`);
};
input.addEventListener('compositionstart', log);
input.addEventListener('compositionupdate', log);
input.addEventListener('compositionend', log);
Live-Suche erst nach bestätigter IME-Eingabe auslösen
const suchfeld = document.querySelector('#suche');
let komponiert = false;
const suche = async (begriff) => {
if (!begriff.trim()) return;
const res = await fetch(`/api/suche?q=${encodeURIComponent(begriff)}`);
const treffer = await res.json();
console.log('Treffer:', treffer.length);
};
suchfeld.addEventListener('compositionstart', () => {
komponiert = true;
});
suchfeld.addEventListener('compositionend', (event) => {
komponiert = false;
console.log('Bestätigt:', event.data);
suche(suchfeld.value);
});
suchfeld.addEventListener('input', (event) => {
// Zwischenstände der IME ignorieren
if (komponiert || event.isComposing) return;
suche(suchfeld.value);
});
Vorschau des Kompositionstexts anzeigen
const editor = document.querySelector('#editor');
const vorschau = document.querySelector('#vorschau');
editor.addEventListener('compositionupdate', (event) => {
vorschau.textContent = `Wird eingegeben: ${event.data}`;
});
editor.addEventListener('compositionend', (event) => {
vorschau.textContent = event.data
? `Übernommen: ${event.data}`
: 'Eingabe abgebrochen';
});
Synthetisches CompositionEvent erzeugen (z. B. für Tests)
const feld = document.createElement('input');
feld.addEventListener('compositionend', (event) => {
console.log('data =', event.data, '| schreibgeschützt:', !Object.getOwnPropertyDescriptor(CompositionEvent.prototype, 'data').set);
});
const ev = new CompositionEvent('compositionend', { data: 'テスト', bubbles: true });
feld.dispatchEvent(ev);
// Wichtig · Fallstricke
- Schreibgeschützt:
datalässt sich nach dem Erzeugen nicht ändern. Den Wert für synthetische Ereignisse setzt man über das Options-Objekt vonnew CompositionEvent(type, { data }). - Nicht für die Eingabeprüfung verwenden:
dataspiegelt nur die Komposition wider, nicht den gesamten Feldinhalt. Für den tatsächlichen Wert immerinput.valuebzw. den DOM-Inhalt lesen. - Browser-Unterschiede: Die Reihenfolge von
compositionendund dem letzteninput-Ereignis unterscheidet sich zwischen den Engines (Chrome feuertinputvorcompositionend, ältere Safari-Versionen auch umgekehrt). Auch der Inhalt vondatabeicompositionstartist nicht überall gleich. Bei Android-Tastaturen kann schon normales Tippen lateinischer Buchstaben Kompositionsereignisse auslösen (Wortvorschläge). - Abbruch: Bricht der Nutzer die Komposition ab (z. B. mit Esc), liefert
compositionendmeist einen leeren String – das sollte der Code berücksichtigen. - Alternative:
InputEvent.isComposingundKeyboardEvent.isComposingzeigen an, ob gerade eine Komposition läuft. Beikeydownwährend der Komposition melden viele BrowserkeyCode 229. - Die Eigenschaft wird von allen modernen Browsern unterstützt. Die früher vorhandene Eigenschaft
localeist veraltet und sollte nicht mehr genutzt werden.