addEventListener vs. Onclick in JavaScript

Habdul Hazeez 15 Februar 2024
addEventListener vs. Onclick in JavaScript

Dieser Artikel erklärt die Unterschiede zwischen JavaScript addEventListener und onclick.

addEventListener vs. onclick in JavaScript

Obwohl sowohl addEventListener als auch onclick denselben Zweck erfüllen können, gibt es einige Nuancen, die Sie kennen sollten.

Darum geht es in diesem Artikel. Darüber hinaus begleiten wir unsere Erläuterungen mit Codebeispielen.

onclick ist ein HTML-Attribut; addEventListener funktioniert nur im <Script>-Element

onclick ist ein HTML-Attribut, sodass Sie es direkt zu einem HTML-Element oder innerhalb des <script>-Elements hinzufügen können. In der Zwischenzeit können Sie addEventListener nur innerhalb des <script>-Elements verwenden.

Zum Beispiel haben wir im folgenden Code onclick als Attribut des button-Elements hinzugefügt. Darüber hinaus ist der Wert von onclick eine JavaScript-Warnmeldung.

Wenn Sie auf die Schaltfläche klicken, sehen Sie daher eine JavaScript-Warnung in Ihrem Webbrowser. Allerdings können Sie addEventListener nicht als HTML-Attribut hinzufügen.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>1-onlick-HTML-attribute-addEventlistener-Via-Script-Element</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #0004ff;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <!-- Add onclick as an attribute of the button -->
        <button id="button" onclick="alert('Perform click actions with onclick attribute.')">Default button</button>
    </main>
</body>

Ausgang:

Klickereignis über das Onclick-Attribut 1

In einem <script>-Element können Sie die Schaltfläche auswählen und als Attribut onclick hinzufügen. Gleichzeitig können Sie dem Button mit addEventListener auch einen Click-Event-Listener hinzufügen.

Im Folgenden hat der HTML-Button also das Attribut onclick und addEventListener. Daher erhalten Sie zwei JavaScript-Warnmeldungen, wenn Sie auf die Schaltfläche klicken.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>1-onlick-HTML-attribute-addEventlistener-Via-Script-Element-V2</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #6800ff;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="button">Default button</button><br/>
    </main>

    <script>
        let button = document.getElementById('button');

        // Here, we are in the <script> element, we can
        // also add onclick to the button
        button.onclick = function() {
            alert("Perform click actions with onclick.")
        }

        // Also add click event via addEventListener
        button.addEventListener("click", function() {
            alert("Perform click actions with addEventListener");
        }, false);
    </script>
</body>

Ausgang:

Klickereignis über das Onclick-Attribut 2

Sie können mehrere addEventListener auf einem Element haben, aber nur einen onclick

Mit dem addEventListener können Sie mehrere Click-Events an ein Element anhängen. Sie können einem Element jedoch nur ein einziges onclick-Attribut zuweisen.

In der Zwischenzeit führt ein Element alle Klickereignisse aus, die über addEventListener hinzugefügt wurden. Wenn also ein Element drei Click-Events via addEventListener hat, werden alle ausgeführt, wenn Sie auf das Element klicken.

Der HTML-Button hat zwei Click-Events via addEventListener im Code unten. Wenn Sie auf die Schaltfläche klicken, werden alle Klickereignisse ausgeführt.

Als Ergebnis sehen Sie in Ihrem Webbrowser zwei JavaScript-Warnmeldungen.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>2-Multiple-Events-With-addEventListener-One-with-Onclick</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #ff0054;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="button">Default button</button><br/>
    </main>

    <script>
        let button = document.getElementById('button');

        // Also add click event via addEventListener
        button.addEventListener("click", function () {
            alert("Perform First click action with addEventListener");
        }, false);

        // Yet another click event via addEventListener
        button.addEventListener("click", function () {
            alert("Perform Second click action with addEventListener");
        }, false);
    </script>
</body>

Ausgang:

Mehrfachklick-Ereignisse mit addEventListener

Wir haben erwähnt, dass Sie nur einen onclick auf ein Element haben können. Was passiert jedoch, wenn Sie mehr als eine haben? Welcher onclick läuft?

Mehrere onclick-Attribute überschreiben sich gegenseitig

Nur letzteres funktioniert, wenn Sie mehrere onclick auf ein einzelnes Element haben. Das liegt daran, dass onclick ein Elementattribut ist, also kann nur eines auf dem Element existieren.

Daher führt Ihr Webbrowser den letzten nur aus, wenn Sie einem Element mehr als einen onclick hinzufügen.

Also haben wir im folgenden Code zwei Click-Events via onclick hinzugefügt. Wenn Sie den Code in Ihrem Webbrowser ausführen, bemerken Sie währenddessen die JavaScript-Warnung für den letzten onclick.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>3-Overwrite onClick</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #a03c32;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="button">Default button</button><br/>
    </main>

    <script>
        let button = document.getElementById('button');

        // Define a first click event with onclick
        button.onclick = function () {
            alert("Perform First click action with addEventListener");
        }

        // Define another click event with onclick.
        // Meanwhile, this one overwrites the first one.
        button.onclick = function () {
            alert("The second onclick runs, not the first!!!");
        }
    </script>
</body>

Ausgang:

Mehrere Klicks überschreiben sich gegenseitig

ein String-Wert von Element.onclick schlägt stillschweigend fehl; addEventListener wirft einen Fehler

Wenn der Funktionswert von onclick in einem <script>-Element ein String ist, schlägt er stillschweigend fehl. Allerdings tritt ein Fehler auf, wenn Sie anstelle der Funktion in addEventListener einen String übergeben.

Im folgenden Beispiel haben wir die Zeichenfolge Sag was? als Wert von button.onclick. Derselbe String, Say what?, steht derweil auch an der Position der Funktion in addEventListener.

Sie erhalten einen TypeError in der Konsole, wenn Sie den Code ausführen. Außerdem passiert nichts, wenn Sie auf die Schaltfläche klicken, es gibt keinerlei Fehler.

Das liegt daran, dass onclick statt einer Funktion einen String-Wert hat. Derweil wirft addEventListener bereits beim ersten Durchlauf des Codes einen Fehler.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>4-Onclick-does-not-respond-to-Errors</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #4aa032;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="button">Default button</button><br/>
    </main>

    <script>
        let button = document.getElementById('button');

        // This will not throw an error.
        button.onclick = "Say what?";

        // This throws an error.
        button.addEventListener("click", "Say what?")
    </script>
</body>

Ausgang:

onclick reagiert nicht auf Fehler

addEventListener gibt Ihnen die Kontrolle über die Anzahl der Klicks; Onclick ist immer verfügbar

addEventListener akzeptiert einen booleschen Wert namens once. Dieser Wert gibt an, wie oft der Listener ausgeführt wird.

Wenn Sie also once als true angeben, wird der Event-Listener nach seiner ersten Ausführung automatisch entfernt. Im folgenden Code hat der Button über onclick und addEventListener ein Click-Event.

In der Zwischenzeit hat der addEventListener den booleschen Wert once auf true gesetzt. Wenn Sie zum ersten Mal auf die Schaltfläche klicken, erhalten Sie daher zwei JavaScript-Warnmeldungen.

Nachfolgende Klicks zeigen jedoch nur das Click-Event von onclick. Das liegt daran, dass der addEventListener nicht mehr existiert.

Beispielcode:

<head>
    <meta charset="utf-8">
    <title>5-Control-addEventListeners-onlclick-always-run</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #5f32a0;
            color: #ffffff;
            border: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="button">Default button</button><br/>
    </main>

    <script>
        let button = document.getElementById('button');

        // Attach click event via onclick that'll always
        // run every time you click the button.
        button.onclick = function () {
            alert("I always run. Click OK and click the button again.")
        }

        // We'll execute this function one time, with addEventListener
        function sayOnce () {
            alert("This is the only time you'll see me. Good Bye.");
        }

        // You can pass a third Boolean value to addEventListener
        // This boolean value defines the number of times you
        // the event listener can work on the element. Here,
        // the event listener will work once.
        button.addEventListener("click", sayOnce, { once: true })
    </script>
</body>

Ausgang:

Ereignis mit addEventListener steuern

onclick kann ein Speicherleck verursachen; addEventListener wird mit dem Element entfernt

Wenn Sie ein Element mit einem Click-Event via onclick entfernen, bleiben onclick und sein Wert im Speicher. Überprüfen Sie zur Bestätigung element.onclick im Array der entfernten Knoten des MutationObserver.

Das element ist der entfernte Knoten mit angehängtem onclick. Außerdem müssen Sie dafür einen MutationObserver einrichten.

Die beiden HTML-Buttons haben Klick-Events via onclick im folgenden Code. In der Zwischenzeit wird durch Klicken auf den Eltern-Button entfernen der Eltern-Button entfernt.

Allerdings protokollieren wir mit MutationObserver den onclick des Parent Button an die Konsole. Dies beweist, dass der onclick auch nach dem Löschen des Parent Button noch existiert.

<head>
    <meta charset="utf-8">
    <title>6-Memory-Leak-via-Onclick.html</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        button {
            padding: 1.2em;
            background-color: #8832a0;
            color: #ffffff;
            border: none;
            cursor: pointer;
            margin-top: 0.2em;
        }
    </style>
</head>
<body>
    <main id="main">
        <button id="parent_button">Parent Button</button><br/>
        <button id="remove_parent_button">Remove Parent Button</button>
    </main>

    <script>
        let main = document.getElementById('main');
        let parent_button = document.getElementById('parent_button');
        let remove_parent_button = document.getElementById('remove_parent_button');

        // Add a function via onclick
        parent_button.onclick = function amIleaking() {
            alert("This onclick function exist after the Parent button dies. \n Remove the Parent button, and Check the console!.");
        }

        // Setup a mutation observer to observe changes
        // in the DOM.
        const observer = new MutationObserver(function(mutations_list) {
            mutations_list.forEach(function(mutation) {
                mutation.removedNodes.forEach(function(removed_node) {
                    if (removed_node.id === 'parent_button') {
                        console.log('#parent_button has been removed');
                        observer.disconnect();
                    }
                    // Even after removal, the onclick function
                    // is available in the removedNodes. Here, [0]
                    // represents the first element of the removed
                    // node, which the parent_button.
                    console.log(mutation.removedNodes[0].onclick);
                    /*To see the function details in Firefox
                    console.log(mutation.removedNodes[0].onclick.toString());*/
                });
            });
        });
        // Observe changes in the main element. Meanwhile,
        // the main element consists of the parent button
        // and the button that removes it.
        observer.observe(document.querySelector("#main"), { subtree: false, childList: true });

        // Setup onclick to remove the parent button
        remove_parent_button.onclick = function () {
            document.querySelector("#parent_button").remove();
        }
    </script>
</body>

Ausgang:

Speicherverlust bei Onclick

addEventListener funktioniert nicht in IE<9; onclick Funktioniert in IE<9

Wenn Sie IE<9 unterstützen möchten, funktioniert addEventListener nicht. Das liegt daran, dass IE<9 das nicht standardmäßige attachEvent unterstützt.

Trotzdem können Sie eine Hilfsfunktion schreiben, wenn Sie IE<9 unterstützen möchten. Diese Funktion prüft, ob der Webbrowser attachEvent oder addEventListener unterstützt.

Wenn der Browser also attachEvent unterstützt, verwenden Sie attachEvent; Andernfalls verwenden Sie addEventListener. In der Zwischenzeit können Sie sich immer auf onclick verlassen, um im IE<9 zu arbeiten.

Sie können also den folgenden Code verwenden, wenn Sie IE<9 unterstützen möchten.

Beispielcode:

// Define an addEvent function and check if
// the element supports attachEvent. Otherwise
// we use addEventListner.
function add_event(element, evnt, funct) {
  if (element.attachEvent) {  // element supports attachEvent
    return element.attachEvent('on' + evnt, funct);
  } else {  // Element does not support attachEvent
    // Use addEventListnere instead
    return element.addEventListener(evnt, funct, false);
  }
}

// How you can use it
add_event(document.getElementById('HTMLElement'), 'click', function() {
  alert('Hello World!');
});
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn

Verwandter Artikel - JavaScript EventListener