snippets · javascript
Warum feuert mein Event-Handler zweimal?
Ein Klick erzeugt zwei Requests oder eine Aktion läuft doppelt. Der offensichtliche Verdacht ist „Browser-Bug“ – meistens ist aber die Initialisierung mehrfach gelaufen oder du beobachtest zwei verschiedene Event-Wege.
Erst beweisen, was doppelt ist
function handleSave(event) {
console.trace('handleSave', {
type: event.type,
target: event.target,
currentTarget: event.currentTarget,
});
}
button.addEventListener('click', handleSave);
console.trace() zeigt nicht nur dass der Handler läuft, sondern über welchen Call-Stack die Registrierung/Verarbeitung erreicht wurde.
Häufige Ursachen
- Initialisierungsfunktion wird zweimal aufgerufen.
- Dasselbe Script wird doppelt eingebunden.
- Delegierter Listener am Elternknoten plus direkter Listener am Kind.
- Formular verarbeitet sowohl Button-
clickals auchsubmit. - Komponente wird neu gemountet, ohne alten Listener zu entfernen.
Registrierung messbar machen
console.count('bind save handler');
button.addEventListener('click', handleSave);
Wenn der Count schon beim Laden auf 2 steigt, brauchst du nicht am Event selbst weiterzusuchen.
Besser als ein globales Flag
Ein alreadyInitialized = true kann Symptome verdecken. Interessanter ist zuerst: Warum läuft die Initialisierung mehrfach? Erst wenn Mehrfachinitialisierung fachlich erlaubt ist, sollte die Komponente idempotent gebaut oder sauber aufgeräumt werden.