Signatur
Beschreibung
Die Schnittstelle InputEvent steht für Ereignisse, die Änderungen an bearbeitbaren Inhalten melden. Dazu gehören <input>- und <textarea>-Elemente sowie Elemente mit contenteditable. Die beiden wichtigsten Ereignistypen sind beforeinput (vor der Änderung, abbrechbar) und input (nach der Änderung, nicht abbrechbar).
Anders als Tastaturereignisse (keydown) erfasst InputEvent jede Art der Eingabe: Tippen, Einfügen, Ausschneiden, Drag & Drop, Autokorrektur, Spracheingabe, IME-Komposition (z. B. Chinesisch/Japanisch) und Rückgängig/Wiederholen. Deshalb ist es der richtige Weg, um auf Inhaltsänderungen zu reagieren.
Die wichtigsten Eigenschaften:
data– eingefügter Text alsstringodernull(z. B. beim Löschen).inputType– Art der Änderung, z. B."insertText","deleteContentBackward","insertFromPaste","historyUndo","formatBold".dataTransfer–DataTransfer-Objekt bei Einfügen/Ablegen incontenteditable, sonstnull.isComposing–true, wenn das Ereignis während einer IME-Komposition auftritt.getTargetRanges()– liefert ein Array vonStaticRange-Objekten, die beibeforeinputden betroffenen Bereich beschreiben.
Eigene Instanzen lassen sich mit new InputEvent(type, options) erzeugen, etwa für Tests. Ein synthetisch ausgelöstes Ereignis ändert den Feldinhalt jedoch nicht – es informiert nur die Listener.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, typischerweise "input" oder "beforeinput" (Konstruktor new InputEvent()). |
|
| $options | InputEventInit | {} | Optionales Objekt mit den UIEventInit-Feldern (bubbles, cancelable, composed, view, detail) sowie data (string|null), inputType (string, Standard ""), isComposing (boolean, Standard false), dataTransfer (DataTransfer|null) und targetRanges (StaticRange[]). |
Rückgabewert
InputEvent-Objekt. Im Browser erhält man Instanzen als Argument der Listener für input und beforeinput.Beispiele
Live-Zeichenzähler mit input-Ereignis
const textarea = document.querySelector('#nachricht');
const zaehler = document.querySelector('#zaehler');
const MAX = 280;
textarea.addEventListener('input', (event) => {
// event ist ein InputEvent
console.log(event.inputType, JSON.stringify(event.data));
zaehler.textContent = `${textarea.value.length} / ${MAX}`;
});
Nur Ziffern zulassen mit beforeinput
const plz = document.querySelector('#plz');
plz.addEventListener('beforeinput', (event) => {
// Löschen, Rückgängig usw. immer erlauben
if (!event.inputType.startsWith('insert')) return;
// Während der IME-Komposition nicht eingreifen
if (event.isComposing) return;
if (event.data !== null && !/^\d+$/.test(event.data)) {
event.preventDefault(); // Änderung wird verhindert
console.log(`Abgelehnt: "${event.data}"`);
}
});
Formatierung in contenteditable abfangen
const editor = document.querySelector('[contenteditable]');
editor.addEventListener('beforeinput', (event) => {
// Strg+B / Strg+I usw. unterbinden – nur Klartext erlaubt
if (event.inputType.startsWith('format')) {
event.preventDefault();
return;
}
if (event.inputType === 'insertFromPaste' && event.dataTransfer) {
event.preventDefault();
const text = event.dataTransfer.getData('text/plain');
const [range] = event.getTargetRanges();
console.log('Einfügen als Klartext:', text, range?.startOffset);
document.execCommand('insertText', false, text);
}
});
InputEvent synthetisch erzeugen (z. B. in Tests)
const feld = document.querySelector('#suche');
feld.addEventListener('input', (e) => {
console.log(e instanceof InputEvent, e.inputType, e.data);
});
// Wert selbst setzen – dispatchEvent ändert den Inhalt nicht!
feld.value = 'js';
feld.dispatchEvent(new InputEvent('input', {
bubbles: true,
inputType: 'insertText',
data: 'js'
}));
// Wichtig · Fallstricke
inputist nicht abbrechbar:preventDefault()wirkt nur beibeforeinput. EinigeinputType-Werte (z. B. bestimmte IME-Kompositionsschritte wieinsertCompositionText) lassen sich auch dort nicht verhindern.- Nicht jedes
input-Ereignis ist einInputEvent: Bei<select>, Checkboxen, Radiobuttons,type=\"range\"odertype=\"color\"liefern Browser teils ein einfachesEventohnedata/inputType. Vor Zugriff mitevent instanceof InputEventprüfen. dataist nicht der Feldinhalt: Für den aktuellen Wert immerevent.target.value(bzw.textContent) lesen.dataist bei Löschvorgängennullund bei<input>/<textarea>istdataTransfermeistnull– dort steht eingefügter Text indata.- IME beachten: Während der Komposition (
isComposing === true) feuern viele Zwischenereignisse. Validierungen oder teure Operationen (Suche, API-Aufrufe) besser erst nachcompositionendausführen bzw. entprellen (debounce). - Programmatische Änderungen über
element.value = …lösen keininput-Ereignis aus. - Kompatibilität:
inputmitdata/inputTypewird von allen modernen Browsern unterstützt;beforeinputundgetTargetRanges()sind erst seit Firefox 87 (2021) überall verfügbar. Die Menge unterstützterinputType-Werte unterscheidet sich zwischen Browsern und Plattformen (vor allem mobil). - Sicherheit: Eingefügtes HTML aus
dataTransfer.getData('text/html')niemals ungefiltert perinnerHTMLeinsetzen (XSS-Gefahr) – vorher bereinigen oder als Klartext einfügen.