Signatur
Beschreibung
Mit new Event() erzeugt man eigene (synthetische) Ereignisse. Sie werden anschließend mit target.dispatchEvent(event) an ein beliebiges EventTarget gesendet, also an DOM-Elemente, window, document oder eigene Unterklassen von EventTarget. Dort registrierte Listener werden synchron aufgerufen, noch bevor dispatchEvent() zurückkehrt.
Typische Einsatzzwecke sind die lose Kopplung von Komponenten (z. B. ein Widget meldet "ready"), das Simulieren von Ereignissen in Tests oder das Auslösen von Standard-Ereignissen wie input oder change, nachdem ein Formularwert per Skript geändert wurde, damit Frameworks die Änderung mitbekommen.
Standardmäßig steigt ein so erzeugtes Ereignis nicht im DOM-Baum auf (bubbles: false) und lässt sich nicht abbrechen (cancelable: false). Beides muss man über das options-Objekt ausdrücklich einschalten. Wer zusätzliche Daten mitschicken will, sollte stattdessen CustomEvent mit der Eigenschaft detail nutzen oder eine eigene Unterklasse von Event anlegen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, z. B. "click", "input" oder ein eigener Name wie "cart:updated". Groß- und Kleinschreibung wird unterschieden. |
|
| $options | object | {} | Optionales Konfigurationsobjekt (EventInit) mit folgenden Eigenschaften:
|
Rückgabewert
Event-Objekt mit isTrusted === false, das noch nicht ausgelöst wurde.Beispiele
Eigenes Ereignis erzeugen und auslösen
const button = document.createElement('button');
button.addEventListener('ready', (event) => {
console.log(`Ereignis: ${event.type}, vertrauenswürdig: ${event.isTrusted}`);
});
const readyEvent = new Event('ready');
button.dispatchEvent(readyEvent);
Aufsteigendes, abbrechbares Ereignis mit Event-Delegation
const list = document.createElement('ul');
const item = document.createElement('li');
list.append(item);
// Listener am Elternelement fängt aufsteigende Ereignisse ab
list.addEventListener('remove-request', (event) => {
if (!confirm('Eintrag wirklich löschen?')) {
event.preventDefault();
}
});
const event = new Event('remove-request', { bubbles: true, cancelable: true });
// dispatchEvent liefert false, wenn preventDefault() aufgerufen wurde
const allowed = item.dispatchEvent(event);
if (allowed) {
item.remove();
console.log('Eintrag gelöscht');
} else {
console.log('Löschen abgebrochen');
}
Frameworks über programmatische Wertänderung informieren
const input = document.querySelector('#email');
// Wert per Skript setzen – löst von sich aus KEIN input-Ereignis aus
input.value = 'max@example.com';
// Ereignisse manuell auslösen, damit Listener/Frameworks reagieren
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
Eigener EventTarget ohne DOM (auch in Node.js)
class Timer extends EventTarget {
start(ms) {
setTimeout(() => this.dispatchEvent(new Event('done')), ms);
}
}
const timer = new Timer();
timer.addEventListener('done', () => console.log('Timer abgelaufen'), { once: true });
timer.start(500);
// Wichtig · Fallstricke
- Kein Aufsteigen per Standard: Ohne
{ bubbles: true }erreichen Ereignisse keine Listener an Elternelementen. Event-Delegation funktioniert dann nicht. preventDefault()wirkungslos: Ohnecancelable: truewird der Aufruf still ignoriert, unddefaultPreventedbleibtfalse.- Keine Standardaktion: Ein synthetisches
new Event('click')löst zwar Listener aus, aber keine Browser-Standardaktionen wie das Folgen eines Links oder das Absenden eines Formulars. Dafürelement.click()bzw.form.requestSubmit()verwenden. WegenisTrusted === falseöffnen solche Ereignisse auch keine Pop-ups und starten weder Vollbild noch Medienwiedergabe. - Synchrone Ausführung:
dispatchEvent()ruft alle Listener sofort auf. Ausnahmen in Listenern werden gemeldet, brechen den Aufrufer aber nicht ab. - Nicht wiederverwendbar während der Auslösung: Ein Ereignis, das gerade ausgelöst wird, kann man nicht erneut senden (
InvalidStateError). Am besten für jede Auslösung ein neues Objekt erzeugen. - Zusätzliche Daten: Dafür
CustomEventmitdetailnutzen oder eine eigene Unterklasse vonEventanlegen. Für Maus- oder Tastaturdaten gibt esMouseEvent,KeyboardEventusw. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Internet Explorer kennt den Konstruktor nicht, dort war das veraltete
document.createEvent()+initEvent()nötig. In Node.js istEventseit Version 15 global verfügbar.