Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die addEventListener()-Methode des EventTarget-Interfaces richtet eine Funktion ein, die immer aufgerufen wird, wenn das angegebene Ereignis an das Ziel geliefert wird.
Häufige Ziele sind Element oder dessen Kinder, Document und Window, aber das Ziel kann jedes Objekt sein, das Ereignisse unterstützt (z.B. IDBRequest).
Hinweis: Die Methode addEventListener() ist der empfohlene Weg, um einen Ereignis-Listener zu registrieren. Die Vorteile sind wie folgt:
Die Methode addEventListener() funktioniert, indem eine Funktion oder ein Objekt, das eine handleEvent()-Funktion implementiert, zur Liste der Ereignis-Listener für den angegebenen Ereignistyp auf dem EventTarget hinzugefügt wird, auf dem sie aufgerufen wird. Wenn die Funktion oder das Objekt bereits in der Liste der Ereignis-Listener für dieses Ziel vorhanden ist, wird die Funktion oder das Objekt nicht ein zweites Mal hinzugefügt.
Hinweis: Wenn eine bestimmte anonyme Funktion in der Liste der für ein bestimmtes Ziel registrierten Ereignis-Listener ist und später im Code eine identische anonyme Funktion in einem addEventListener-Aufruf angegeben wird, wird die zweite Funktion auch der Liste der Ereignis-Listener für dieses Ziel hinzugefügt.
Tatsächlich sind anonyme Funktionen nicht identisch, selbst wenn sie unter Verwendung desselben unveränderten Quellcodes wiederholt definiert werden, auch wenn sie in einer Schleife verwendet werden.
Das wiederholte Definieren derselben unbenannten Funktion kann in solchen Fällen problematisch sein. (Siehe Speicherprobleme unten.)
Wenn ein Ereignis-Listener zu einem EventTarget von innerhalb eines anderen Listeners hinzugefügt wird — also während der Verarbeitung des Ereignisses — wird dieses Ereignis den neuen Listener nicht auslösen. Der neue Listener kann jedoch während einer späteren Phase des Ereignisstromes ausgelöst werden, z.B. während der Bubbling-Phase.
Eine Groß- und Kleinschreibung berücksichtigende Zeichenfolge, die den Ereignistyp angibt, für den Sie lauschen möchten.
listenerDas Objekt, das eine Benachrichtigung erhält (ein Objekt, das das Event-Interface implementiert), wenn ein Ereignis des angegebenen Typs auftritt. Dies muss null, ein Objekt mit einer handleEvent()-Methode oder eine JavaScript-Funktion sein. Weitere Informationen zum Callback selbst finden Sie unter Der Ereignislistener-Callback.
options OptionalEin Objekt, das Eigenschaften des Ereignis-Listeners spezifiziert. Die verfügbaren Optionen sind:
capture OptionalEin boolean-Wert, der angibt, dass Ereignisse dieses Typs an den registrierten listener gesendet werden, bevor sie an ein darunter liegendes EventTarget im DOM-Baum gesendet werden. Wenn nicht angegeben, wird der Standardwert false verwendet.
once OptionalEin boolean-Wert, der angibt, dass der listener höchstens einmal nach dem Hinzufügen aufgerufen werden sollte. Wenn true, wird der listener automatisch entfernt, wenn er aufgerufen wird. Wenn nicht angegeben, wird der Standardwert false verwendet.
passive OptionalEin boolean-Wert, der, wenn true, angibt, dass die durch den listener spezifizierte Funktion niemals preventDefault() aufrufen wird. Wenn ein passiver Listener preventDefault() aufruft, passiert nichts, und es kann eine Konsolenwarnung generiert werden.
Wenn diese Option nicht angegeben ist, ist der Standardwert false – außer dass in anderen Browsern als Safari der Standardwert für wheel, mousewheel, touchstart und touchmove-Ereignisse true ist. Siehe Verwendung von passiven Listeners, um mehr zu erfahren.
signal OptionalEin AbortSignal. Der Listener wird entfernt, wenn die abort()-Methode des AbortController, welches das AbortSignal besitzt, aufgerufen wird. Wenn nicht angegeben, wird kein AbortSignal mit dem Listener verknüpft.
useCapture OptionalEin boolean-Wert, der angibt, ob Ereignisse dieses Typs an den registrierten listener bevor sie an ein darunter liegendes EventTarget im DOM-Baum gesendet werden, gesendet werden. Ereignisse, die nach oben durch den Baum dringen, lösen keinen Listener aus, der zum Capture verwendet werden soll. Event-Bubbling und -Capturing sind zwei Möglichkeiten zur Ereignisverarbeitung, die auftreten, wenn ein Ereignis in einem verschachtelten Element ausgelöst wird, in dem beide Elemente einen Handler für dieses Ereignis registriert haben. Der Event-Propagation-Modus bestimmt die Reihenfolge, in der Elemente das Ereignis empfangen. Siehe die DOM-Spezifikation und JavaScript-Ereignisreihenfolge für eine detaillierte Erklärung. Wenn nicht angegeben, ist der Standardwert für useCapture false.
Hinweis: Für Ereignis-Listener, die am Ereignisziel angebracht sind, befindet sich das Ereignis in der Zielphase und nicht in den Phasen Capturing und Bubbling. Ereignis-Listener in der Capturing-Phase werden vor den Ereignis-Listenern in der Ziel- und Bubbling-Phase aufgerufen.
Ein Firefox (Gecko)-spezifischer Parameter. Wenn true, erhält der Listener synthetische Ereignisse, die durch Web-Inhalte ausgelöst werden (der Standard ist false für Browser-chrome und true für reguläre Webseiten). Dieser Parameter ist nützlich für Code, der in Add-ons sowie im Browser selbst gefunden wird.
Keiner (undefined).
Der Ereignis-Listener kann entweder als Callback-Funktion oder als ein Objekt angegeben werden, dessen handleEvent()-Methode als Callback-Funktion dient.
Die Callback-Funktion selbst hat dieselben Parameter und denselben Rückgabewert wie die handleEvent()-Methode; d.h. der Callback akzeptiert einen einzigen Parameter: ein auf Event basierendes Objekt, das das aufgetretene Ereignis beschreibt, und gibt nichts zurück.
Beispielsweise könnte ein Callback für den Ereignis-Handler, der sowohl fullscreenchange als auch fullscreenerror verarbeiten kann, so aussehen:
Es ist oft wünschenswert, auf das Element zuzugreifen, auf dem der Ereignis-Handler ausgelöst wurde, z.B. bei Verwendung eines generischen Handlers für eine Gruppe ähnlicher Elemente.
Wenn Sie eine Handler-Funktion mit addEventListener() einem Element hinzufügen, ist der Wert von this innerhalb des Handlers ein Verweis auf das Element. Es wird derselbe sein wie der Wert der currentTarget-Eigenschaft des Ereignisarguments, das an den Handler übergeben wird.
Zur Erinnerung: Pfeilfunktionen haben keinen eigenen this-Kontext.
Wenn ein Ereignis-Handler (z.B. onclick) in der HTML-Quelle auf einem Element spezifiziert wird, wird der JavaScript-Code im Attributwert effektiv in einer Handler-Funktion eingeschlossen, die den Wert von this konsistent mit addEventListener() bindet; ein Vorkommen von this innerhalb des Codes stellt einen Verweis auf das Element dar.
Beachten Sie, dass der Wert von this innerhalb einer Funktion, die vom Code im Attributwert aufgerufen wird, sich gemäß Standardregeln verhält. Dies wird im folgenden Beispiel gezeigt:
Der Wert von this innerhalb von logID() ist ein Verweis auf das globale Objekt Window (oder undefined, im Fall des Strict-Modus).
Die Methode Function.prototype.bind() ermöglicht es Ihnen, einen festen this-Kontext für alle nachfolgenden Aufrufe zu definieren — um Probleme zu umgehen, bei denen unklar ist, was this sein wird, abhängig davon, aus welchem Kontext Ihre Funktion aufgerufen wurde. Beachten Sie jedoch, dass Sie einen Verweis auf den Listener behalten müssen, damit Sie ihn später entfernen können.
Dies ist ein Beispiel mit und ohne bind():
Eine weitere Lösung besteht darin, eine spezielle Funktion namens handleEvent() zu verwenden, um Ereignisse abzufangen:
Eine andere Möglichkeit, den Verweis auf this zu handhaben, ist die Verwendung einer Pfeilfunktion, die keinen eigenen this-Kontext erstellt.
Ereignis-Listener nehmen nur ein Argument entgegen, ein Event oder eine Unterklasse von Event, die automatisch an den Listener übergeben wird, und der Rückgabewert wird ignoriert. Daher, um Daten in einen und aus einem Ereignis-Listener zu bekommen, müssen Sie anstelle des Übergangs von Daten durch Parameter und Rückgabewerte Closures erstellen.
Die Funktionen, die als Ereignis-Listener übergeben werden, haben Zugriff auf alle Variablen, die in den äußeren Bereichen der Funktion deklariert sind, die die Funktion enthält.
Lesen Sie den Funktionsleitfaden für mehr Informationen über Funktionsbereiche.
Im ersten obigen Fall wird bei jeder Iteration der Schleife eine neue (anonyme) Handler-Funktion erstellt. Im zweiten Fall wird die gleiche zuvor deklarierte Funktion als Ereignis-Handler verwendet, was zu einem geringeren Speicherverbrauch führt, da nur eine Handler-Funktion erstellt wird. Darüber hinaus ist es im ersten Fall nicht möglich, removeEventListener() aufzurufen, da kein Verweis auf die anonyme Funktion behalten wird (oder hier, nicht behalten wird für eine der mehreren anonymen Funktionen, die die Schleife erstellen könnte). Im zweiten Fall ist es möglich, myElement.removeEventListener("click", processEvent, false) zu verwenden, da processEvent der Funktionsverweis ist.
Tatsächlich ist im Hinblick auf den Speicherverbrauch das Nichtbehalten eines Funktionsverweises nicht das eigentliche Problem; vielmehr ist es das Nichtbehalten eines statischen Funktionsverweises.
Wenn ein Ereignis eine Standardaktion hat — zum Beispiel ein wheel-Ereignis, das den Container standardmäßig scrollt — ist der Browser im Allgemeinen nicht in der Lage, die Standardaktion zu starten, bis der Ereignis-Listener fertig ist, da er nicht im Voraus weiß, ob der Ereignis-Listener die Standardaktion durch Aufruf von Event.preventDefault() abbrechen könnte. Wenn der Ereignis-Listener zu lange braucht, um fertig zu werden, kann dies zu einer spürbaren Verzögerung führen, auch bekannt als Jank, bevor die Standardaktion ausgeführt werden kann.
Indem die passive-Option auf true gesetzt wird, erklärt ein Ereignis-Listener, dass er die Standardaktion nicht abbrechen wird, sodass der Browser die Standardaktion sofort starten kann, ohne auf das Ende des Listeners zu warten. Wenn der Listener dann Event.preventDefault() aufruft, hat dies keine Wirkung.
Die Spezifikation für addEventListener() definiert den Standardwert für die passive-Option als immer false. Allerdings haben moderne Browser den Standardwert der passive-Option auf true geändert für die wheel, mousewheel, touchstart und touchmove-Ereignisse auf den Dokumentebenen-Knoten Window, Document und Document.body. Das verhindert, dass der Ereignis-Listener das Ereignis abbrechen kann, sodass das Rendern der Seite beim Scrollen des Benutzers nicht blockiert wird.
Deshalb, wenn Sie dieses Verhalten übersteuern möchten und sicherstellen möchten, dass die passive-Option false ist, müssen Sie die Option explizit auf false setzen (anstatt sich auf den Standardwert zu verlassen).
Sie müssen sich keine Sorgen über den Wert von passive für das grundlegende scroll-Ereignis machen. Da es nicht abgebrochen werden kann, können Ereignis-Listener das Rendern der Seite ohnehin nicht blockieren.
Siehe Verbesserung der Scroll-Leistung durch passive Listeners für ein Beispiel, das den Effekt von passiven Listeners zeigt.
Dieses Beispiel demonstriert, wie addEventListener() verwendet wird, um auf Mausklicks auf ein Element zu lauschen.
In diesem Code ist modifyText() ein Listener für click-Ereignisse, der mit addEventListener() registriert wurde. Ein Klick irgendwo in der Tabelle "bubbelt" bis zum Handler und ruft modifyText() auf.
Dieses Beispiel zeigt, wie man einen addEventListener()-Aufruf hinzufügt, der mit einem AbortSignal abgebrochen werden kann.
Im obigen Beispiel modifizieren wir den Code aus dem vorherigen Beispiel so, dass nachdem der Inhalt der zweiten Zeile zu "three" geändert wurde, wir abort() vom AbortController aufrufen, den wir dem addEventListener()-Aufruf übergeben haben. Das führt dazu, dass der Wert für immer "three" bleibt, da wir keinen Code mehr haben, der auf ein Klickereignis lauscht.
Hier schauen wir, wie man eine anonyme Funktion verwendet, um Parameter in den Ereignis-Listener zu übergeben.
Beachten Sie, dass der Listener eine anonyme Funktion ist, die Code kapselt, der wiederum in der Lage ist, Parameter an die modifyText()-Funktion zu übergeben, die für die Reaktion auf das Ereignis verantwortlich ist.
Dieses Beispiel zeigt einen Ereignis-Listener, der mit der Notation für Pfeilfunktionen implementiert wird.
Bitte beachten Sie, dass anonyme und Pfeilfunktionen zwar ähnlich sind, jedoch unterschiedliche this-Bindings haben. Während anonyme (und alle traditionellen JavaScript-Funktionen) ihre eigenen this-Bindings erstellen, erben Pfeilfunktionen das this-Binding der umgebenden Funktion.
Das bedeutet, dass Variablen und Konstanten, die der umgebenden Funktion zur Verfügung stehen, auch dem Ereignis-Handler zur Verfügung stehen, wenn man eine Pfeilfunktion verwendet.
Klicken Sie die äußeren, mittleren, inneren Container jeweils an, um zu sehen, wie die Optionen funktionieren.
Sie können mehr als eine der Optionen im options-Parameter setzen. Im folgenden Beispiel setzen wir zwei Optionen:
Das folgende Beispiel zeigt den Effekt der Einstellung von passive. Es enthält ein <div>, das einige Texte und ein Kontrollkästchen enthält.
Der Code fügt dem Container-Ereignis wheel einen Listener hinzu, der standardmäßig den Container scrollt. Der Listener führt eine lang andauernde Operation aus. Zunächst wird der Listener mit der passive-Option hinzugefügt, und immer wenn das Kontrollkästchen umgeschaltet wird, wird die passive-Option umgeschaltet.
Der Effekt ist, dass:
| DOM # ref-for-dom-eventtarget-addeventlistener③ |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.