Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
EventTarget: addEventListener() Methode
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
* Some parts of this feature may have varying levels of support.
Hinweis: Diese Funktion ist inWeb Workers verfügbar.
DieaddEventListener()-Methode desEventTarget-Interfaces richtet eine Funktion ein, die immer aufgerufen wird, wenn das angegebene Ereignis an das Ziel geliefert wird.
Häufige Ziele sindElement oder dessen Kinder,Document undWindow, aber das Ziel kann jedes Objekt sein, das Ereignisse unterstützt (z.B.IDBRequest).
Hinweis:Die MethodeaddEventListener() ist derempfohlene Weg, um einen Ereignis-Listener zu registrieren. Die Vorteile sind wie folgt:
- Sie erlaubt es, mehr als einen Handler für ein Ereignis hinzuzufügen. Dies ist besonders nützlich für Bibliotheken, JavaScript-Module oder andere Arten von Code, die gut mit anderen Bibliotheken oder Erweiterungen funktionieren müssen.
- Im Gegensatz zur Verwendung einer
onXYZ-Eigenschaft gibt sie Ihnen eine feinere Kontrolle über die Phase, in der der Listener aktiviert wird (Capturing vs. Bubbling). - Sie funktioniert mit jedem Ereignisziel, nicht nur mit HTML- oder SVG-Elementen.
Die MethodeaddEventListener() funktioniert, indem eine Funktion oder ein Objekt, das einehandleEvent()-Funktion implementiert, zur Liste der Ereignis-Listener für den angegebenen Ereignistyp auf demEventTarget 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 einemaddEventListener-Aufruf angegeben wird, wird die zweite Funktionauch 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. (SieheSpeicherprobleme unten.)
Wenn ein Ereignis-Listener zu einemEventTarget 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.
In diesem Artikel
Syntax
addEventListener(type, listener)addEventListener(type, listener, options)addEventListener(type, listener, useCapture)Parameter
typeEine Groß- und Kleinschreibung berücksichtigende Zeichenfolge, die denEreignistyp 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 mussnull, ein Objekt mit einerhandleEvent()-Methode oder eine JavaScript-Funktion sein. Weitere Informationen zum Callback selbst finden Sie unterDer Ereignislistener-Callback.optionsOptionalEin Objekt, das Eigenschaften des Ereignis-Listeners spezifiziert. Die verfügbaren Optionen sind:
captureOptionalEin boolean-Wert, der angibt, dass Ereignisse dieses Typs an den registrierten
listenergesendet werden, bevor sie an ein darunter liegendesEventTargetim DOM-Baum gesendet werden. Wenn nicht angegeben, wird der Standardwertfalseverwendet.onceOptionalEin boolean-Wert, der angibt, dass der
listenerhöchstens einmal nach dem Hinzufügen aufgerufen werden sollte. Wenntrue, wird derlistenerautomatisch entfernt, wenn er aufgerufen wird. Wenn nicht angegeben, wird der Standardwertfalseverwendet.passiveOptionalEin boolean-Wert, der, wenn
true, angibt, dass die durch denlistenerspezifizierte Funktion niemalspreventDefault()aufrufen wird. Wenn ein passiver ListenerpreventDefault()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ürwheel,mousewheel,touchstartundtouchmove-Ereignissetrueist. SieheVerwendung von passiven Listeners, um mehr zu erfahren.signalOptionalEin
AbortSignal. Der Listener wird entfernt, wenn dieabort()-Methode desAbortController, welches dasAbortSignalbesitzt, aufgerufen wird. Wenn nicht angegeben, wird keinAbortSignalmit dem Listener verknüpft.
useCaptureOptionalEin boolean-Wert, der angibt, ob Ereignisse dieses Typs an den registrierten
listenerbevor sie an ein darunter liegendesEventTargetim 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. Siehedie DOM-Spezifikation undJavaScript-Ereignisreihenfolge für eine detaillierte Erklärung. Wenn nicht angegeben, ist der Standardwert füruseCapturefalse.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 derCapturing-Phase werden vor den Ereignis-Listenern in der Ziel- und Bubbling-Phase aufgerufen.
wantsUntrustedOptionalNicht standardisiertEin Firefox (Gecko)-spezifischer Parameter. Wenn
true, erhält der Listener synthetische Ereignisse, die durch Web-Inhalte ausgelöst werden (der Standard istfalsefür Browser-chrome undtruefür reguläre Webseiten). Dieser Parameter ist nützlich für Code, der in Add-ons sowie im Browser selbst gefunden wird.
Rückgabewert
Keiner (undefined).
Verwendungshinweise
>Der Ereignislistener-Callback
Der Ereignis-Listener kann entweder als Callback-Funktion oder als ein Objekt angegeben werden, dessenhandleEvent()-Methode als Callback-Funktion dient.
Die Callback-Funktion selbst hat dieselben Parameter und denselben Rückgabewert wie diehandleEvent()-Methode; d.h. der Callback akzeptiert einen einzigen Parameter: ein aufEvent basierendes Objekt, das das aufgetretene Ereignis beschreibt, und gibt nichts zurück.
Beispielsweise könnte ein Callback für den Ereignis-Handler, der sowohlfullscreenchange als auchfullscreenerror verarbeiten kann, so aussehen:
function handleEvent(event) { if (event.type === "fullscreenchange") { /* handle a full screen toggle */ } else { /* handle a full screen toggle error */ }}Der Wert von "this" im Handler
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 mitaddEventListener() einem Element hinzufügen, ist der Wert vonthis innerhalb des Handlers ein Verweis auf das Element. Es wird derselbe sein wie der Wert dercurrentTarget-Eigenschaft des Ereignisarguments, das an den Handler übergeben wird.
myElement.addEventListener("click", function (e) { console.log(this.className); // logs the className of myElement console.log(e.currentTarget === this); // logs `true`});Zur Erinnerung:Pfeilfunktionen haben keinen eigenenthis-Kontext.
myElement.addEventListener("click", (e) => { console.log(this.className); // WARNING: `this` is not `myElement` console.log(e.currentTarget === this); // logs `false`});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 vonthis konsistent mitaddEventListener() bindet; ein Vorkommen vonthis innerhalb des Codes stellt einen Verweis auf das Element dar.
<table> <!-- `this` refers to the table; logs 'my-table' --> …</table>Beachten Sie, dass der Wert vonthis innerhalb einer Funktion, dievom Code im Attributwert aufgerufen wird, sich gemäßStandardregeln verhält. Dies wird im folgenden Beispiel gezeigt:
<script> function logID() { console.log(this.id); }</script><table> <!-- when called, `this` will refer to the global object --> …</table>Der Wert vonthis innerhalb vonlogID() ist ein Verweis auf das globaleObjektWindow (oderundefined, im Fall desStrict-Modus).
"this" mit bind() spezifizieren
Die MethodeFunction.prototype.bind() ermöglicht es Ihnen, einen festenthis-Kontext für alle nachfolgenden Aufrufe zu definieren — um Probleme zu umgehen, bei denen unklar ist, wasthis 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 ohnebind():
class Something { name = "Something Good"; constructor(element) { // bind causes a fixed `this` context to be assigned to `onclick2` this.onclick2 = this.onclick2.bind(this); element.addEventListener("click", this.onclick1); element.addEventListener("click", this.onclick2); // Trick } onclick1(event) { console.log(this.name); // undefined, as `this` is the element } onclick2(event) { console.log(this.name); // 'Something Good', as `this` is bound to the Something instance }}const s = new Something(document.body);Eine weitere Lösung besteht darin, eine spezielle Funktion namenshandleEvent() zu verwenden, umEreignisse abzufangen:
class Something { name = "Something Good"; constructor(element) { // Note that the listeners in this case are `this`, not this.handleEvent element.addEventListener("click", this); element.addEventListener("dblclick", this); } handleEvent(event) { console.log(this.name); // 'Something Good', as this is bound to newly created object switch (event.type) { case "click": // some code here… break; case "dblclick": // some code here… break; } }}const s = new Something(document.body);Eine andere Möglichkeit, den Verweis aufthis zu handhaben, ist die Verwendung einer Pfeilfunktion, die keinen eigenenthis-Kontext erstellt.
class SomeClass { name = "Something Good"; register() { window.addEventListener("keydown", (e) => { this.someMethod(e); }); } someMethod(e) { console.log(this.name); switch (e.code) { case "ArrowUp": // some code here… break; case "ArrowDown": // some code here… break; } }}const myObject = new SomeClass();myObject.register();Daten in einen und aus einem Ereignis-Listener bekommen
Ereignis-Listener nehmen nur ein Argument entgegen,einEvent oder eine Unterklasse vonEvent,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ückgabewerteClosures 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.
const myButton = document.getElementById("my-button-id");let someString = "Data";myButton.addEventListener("click", () => { console.log(someString); // 'Data' on first click, // 'Data Again' on second click someString = "Data Again";});console.log(someString); // Expected Value: 'Data' (will never output 'Data Again')Lesen Sieden Funktionsleitfaden für mehr Informationen über Funktionsbereiche.
Speicherprobleme
const elems = document.getElementsByTagName("*");// Case 1for (const elem of elems) { elem.addEventListener("click", (e) => { // Do something });}// Case 2function processEvent(e) { // Do something}for (const elem of elems) { elem.addEventListener("click", processEvent);}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, daprocessEvent der Funktionsverweis ist.
Tatsächlich ist im Hinblick auf den Speicherverbrauch das Nichtbehalten eines Funktionsverweises nicht das eigentliche Problem; vielmehr ist es das Nichtbehalten einesstatischen Funktionsverweises.
Verwendung von passiven Listeners
Wenn ein Ereignis eine Standardaktion hat — zum Beispiel einwheel-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 vonEvent.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 alsJank, bevor die Standardaktion ausgeführt werden kann.
Indem diepassive-Option auftrue 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 dannEvent.preventDefault() aufruft, hat dies keine Wirkung.
Die Spezifikation füraddEventListener() definiert den Standardwert für diepassive-Option als immerfalse. Allerdings haben moderne Browser den Standardwert derpassive-Option auftrue geändert für diewheel,mousewheel,touchstart undtouchmove-Ereignisse auf den Dokumentebenen-KnotenWindow,Document undDocument.body. Das verhindert, dass der Ereignis-Listenerdas 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 diepassive-Optionfalse ist, müssen Sie die Option explizit auffalse setzen (anstatt sich auf den Standardwert zu verlassen).
Sie müssen sich keine Sorgen über den Wert vonpassive für das grundlegendescroll-Ereignis machen.Da es nicht abgebrochen werden kann, können Ereignis-Listener das Rendern der Seite ohnehin nicht blockieren.
SieheVerbesserung der Scroll-Leistung durch passive Listeners für ein Beispiel, das den Effekt von passiven Listeners zeigt.
Beispiele
>Einen einfachen Listener hinzufügen
Dieses Beispiel demonstriert, wieaddEventListener() verwendet wird, um auf Mausklicks auf ein Element zu lauschen.
HTML
<table> <tbody> <tr> <td>one</td> </tr> <tr> <td>two</td> </tr> </tbody></table>JavaScript
// Function to change the content of t2function modifyText() { const t2 = document.getElementById("t2"); const isNodeThree = t2.firstChild.nodeValue === "three"; t2.firstChild.nodeValue = isNodeThree ? "two" : "three";}// Add event listener to tableconst el = document.getElementById("outside");el.addEventListener("click", modifyText);In diesem Code istmodifyText() ein Listener fürclick-Ereignisse, der mitaddEventListener() registriert wurde. Ein Klick irgendwo in der Tabelle "bubbelt" bis zum Handler und ruftmodifyText() auf.
Ergebnis
Einen abbruchbaren Listener hinzufügen
Dieses Beispiel zeigt, wie man einenaddEventListener()-Aufruf hinzufügt, der mit einemAbortSignal abgebrochen werden kann.
HTML
<table> <tbody> <tr> <td>one</td> </tr> <tr> <td>two</td> </tr> </tbody></table>JavaScript
// Add an abortable event listener to tableconst controller = new AbortController();const el = document.getElementById("outside");el.addEventListener("click", modifyText, { signal: controller.signal });// Function to change the content of t2function modifyText() { const t2 = document.getElementById("t2"); if (t2.firstChild.nodeValue === "three") { t2.firstChild.nodeValue = "two"; } else { t2.firstChild.nodeValue = "three"; controller.abort(); // remove listener after value reaches "three" }}Im obigen Beispiel modifizieren wir den Code aus dem vorherigen Beispiel so, dass nachdem der Inhalt der zweiten Zeile zu "three" geändert wurde, wirabort() vomAbortController aufrufen, den wir demaddEventListener()-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.
Ergebnis
Ereignis-Listener mit anonymer Funktion
Hier schauen wir, wie man eine anonyme Funktion verwendet, um Parameter in denEreignis-Listener zu übergeben.
HTML
<table> <tbody> <tr> <td>one</td> </tr> <tr> <td>two</td> </tr> </tbody></table>JavaScript
// Function to change the content of t2function modifyText(newText) { const t2 = document.getElementById("t2"); t2.firstChild.nodeValue = newText;}// Function to add event listener to tableconst el = document.getElementById("outside");el.addEventListener("click", function () { modifyText("four");});Beachten Sie, dass der Listener eine anonyme Funktion ist, die Code kapselt, der wiederum in der Lage ist, Parameter an diemodifyText()-Funktion zu übergeben, die für die Reaktion auf das Ereignis verantwortlich ist.
Ergebnis
Ereignis-Listener mit einer Pfeilfunktion
Dieses Beispiel zeigt einen Ereignis-Listener, der mit der Notation für Pfeilfunktionenimplementiert wird.
HTML
<table> <tbody> <tr> <td>one</td> </tr> <tr> <td>two</td> </tr> </tbody></table>JavaScript
// Function to change the content of t2function modifyText(newText) { const t2 = document.getElementById("t2"); t2.firstChild.nodeValue = newText;}// Add event listener to table with an arrow functionconst el = document.getElementById("outside");el.addEventListener("click", () => { modifyText("four");});Ergebnis
Bitte beachten Sie, dass anonyme und Pfeilfunktionen zwar ähnlich sind, jedoch unterschiedlichethis-Bindings haben. Während anonyme (und alle traditionellen JavaScript-Funktionen)ihre eigenenthis-Bindings erstellen, erben Pfeilfunktionen dasthis-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.
Beispiel zur Verwendung von Optionen
HTML
<div> outer, once & none-once <div> middle, capture & none-capture <a href="https://www.mozilla.org"> inner1, passive & preventDefault(which is not allowed) </a> <a href="https://developer.mozilla.org/"> inner2, none-passive & preventDefault(not open new page) </a> </div></div><hr /><button>Clear logs</button><section></section>CSS
.outer,.middle,.inner1,.inner2 { display: block; width: 520px; padding: 15px; margin: 15px; text-decoration: none;}.outer { border: 1px solid red; color: red;}.middle { border: 1px solid green; color: green; width: 460px;}.inner1,.inner2 { border: 1px solid purple; color: purple; width: 400px;}.demo-logs { width: 530px; height: 16rem; background-color: #dddddd; overflow-x: auto; padding: 1rem;}JavaScript
const clearBtn = document.querySelector(".clear-button");const demoLogs = document.querySelector(".demo-logs");function log(msg) { demoLogs.innerText += `${msg}\n`;}clearBtn.addEventListener("click", () => { demoLogs.innerText = "";});const outer = document.querySelector(".outer");const middle = document.querySelector(".middle");const inner1 = document.querySelector(".inner1");const inner2 = document.querySelector(".inner2");const capture = { capture: true,};const noneCapture = { capture: false,};const once = { once: true,};const noneOnce = { once: false,};const passive = { passive: true,};const nonePassive = { passive: false,};outer.addEventListener("click", onceHandler, once);outer.addEventListener("click", noneOnceHandler, noneOnce);middle.addEventListener("click", captureHandler, capture);middle.addEventListener("click", noneCaptureHandler, noneCapture);inner1.addEventListener("click", passiveHandler, passive);inner2.addEventListener("click", nonePassiveHandler, nonePassive);function onceHandler(event) { log("outer, once");}function noneOnceHandler(event) { log("outer, none-once, default\n");}function captureHandler(event) { // event.stopImmediatePropagation(); log("middle, capture");}function noneCaptureHandler(event) { log("middle, none-capture, default");}function passiveHandler(event) { // Unable to preventDefault inside passive event listener invocation. event.preventDefault(); log("inner1, passive, open new page");}function nonePassiveHandler(event) { event.preventDefault(); // event.stopPropagation(); log("inner2, none-passive, default, not open new page");}Ergebnis
Klicken Sie die äußeren, mittleren, inneren Container jeweils an, um zu sehen, wie die Optionen funktionieren.
Ereignis-Listener mit mehreren Optionen
Sie können mehr als eine der Optionen imoptions-Parameter setzen. Im folgenden Beispiel setzen wir zwei Optionen:
passive, um sicherzustellen, dass der Handler nichtpreventDefault()aufruftonce, um sicherzustellen, dass der Ereignis-Handler nur einmal aufgerufen wird.
HTML
<button>You have not clicked this button.</button><button>Click this button to reset the first button.</button>JavaScript
const buttonToBeClicked = document.getElementById("example-button");const resetButton = document.getElementById("reset-button");// the text that the button is initialized withconst initialText = buttonToBeClicked.textContent;// the text that the button contains after being clickedconst clickedText = "You have clicked this button.";// we hoist the event listener callback function// to prevent having duplicate listeners attachedfunction eventListener() { buttonToBeClicked.textContent = clickedText;}function addListener() { buttonToBeClicked.addEventListener("click", eventListener, { passive: true, once: true, });}// when the reset button is clicked, the example button is reset,// and allowed to have its state updated againresetButton.addEventListener("click", () => { buttonToBeClicked.textContent = initialText; addListener();});addListener();Ergebnis
Verbesserung der Scroll-Leistung durch passive Listeners
Das folgende Beispiel zeigt den Effekt der Einstellung vonpassive. Es enthält ein<div>, das einige Texte und ein Kontrollkästchen enthält.
HTML
<div> <p> But down there it would be dark now, and not the lovely lighted aquarium she imagined it to be during the daylight hours, eddying with schools of tiny, delicate animals floating and dancing slowly to their own serene currents and creating the look of a living painting. That was wrong, in any case. The ocean was different from an aquarium, which was an artificial environment. The ocean was a world. And a world is not art. Dorothy thought about the living things that moved in that world: large, ruthless and hungry. Like us up here. </p></div><div> <input type="checkbox" name="passive" checked /> <label for="passive">passive</label></div>#container { width: 150px; height: 200px; overflow: scroll; margin: 2rem 0; padding: 0.4rem; border: 1px solid black;}JavaScript
Der Code fügt dem Container-Ereigniswheel einen Listener hinzu, der standardmäßig den Container scrollt. Der Listener führt eine lang andauernde Operation aus. Zunächst wird der Listener mit derpassive-Option hinzugefügt, und immer wenn das Kontrollkästchen umgeschaltet wird, wird diepassive-Option umgeschaltet.
const passive = document.querySelector("#passive");const container = document.querySelector("#container");passive.addEventListener("change", (event) => { container.removeEventListener("wheel", wheelHandler); container.addEventListener("wheel", wheelHandler, { passive: passive.checked, once: true, });});container.addEventListener("wheel", wheelHandler, { passive: true, once: true,});function wheelHandler() { function isPrime(n) { for (let c = 2; c <= Math.sqrt(n); ++c) { if (n % c === 0) { return false; } } return true; } const quota = 1000000; const primes = []; const maximum = 1000000; while (primes.length < quota) { const candidate = Math.floor(Math.random() * (maximum + 1)); if (isPrime(candidate)) { primes.push(candidate); } } console.log(primes);}Ergebnis
Der Effekt ist, dass:
- Zunächst ist der Listener passiv, sodass der Versuch, den Container mit dem Rad zu scrollen, sofort erfolgt.
- Wenn Sie "passive" deaktivieren und versuchen, den Container mit dem Rad zu scrollen, gibt es eine spürbare Verzögerung, bevor der Container scrollt, da der Browser warten muss, bis der lang andauernde Listener beendet ist.
Spezifikationen
| Specification |
|---|
| DOM> # ref-for-dom-eventtarget-addeventlistener③> |