addEventListener frente a Onclick en JavaScript

Habdul Hazeez 15 febrero 2024
addEventListener frente a Onclick en JavaScript

Este artículo explica las diferencias entre JavaScript addEventListener y onclick.

addEventListener frente a onclick en JavaScript

Aunque tanto addEventListener como onclick pueden servir para el mismo propósito, hay algunos matices que debes conocer.

Entonces, de eso se trata este artículo. Además, acompañaremos nuestras explicaciones con ejemplos de código.

onclick es un atributo HTML; addEventListener solo funciona en el elemento <Script>

onclick es un atributo HTML para que pueda agregarlo directamente a un elemento HTML o dentro del elemento <script>. Mientras tanto, solo puede usar addEventListener dentro del elemento <script>.

Por ejemplo, hemos agregado onclick como un atributo del elemento botón en el siguiente código. No solo eso, el valor de onclick es un mensaje de alerta de JavaScript.

Por lo tanto, cuando haga clic en el botón, observará una alerta de JavaScript en su navegador web. Sin embargo, no puede agregar addEventListener como un atributo HTML.

Código de ejemplo:

<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>

Producción:

haga clic en evento a través del atributo onclick 1

En un elemento <script>, puede seleccionar el botón y agregar onclick como su atributo. Al mismo tiempo, también puede agregar un detector de eventos de clic al botón usando addEventListener.

Entonces, a continuación, el botón HTML tiene el atributo onclick y addEventListener. Como resultado, recibirá dos mensajes de alerta de JavaScript cuando haga clic en el botón.

Código de ejemplo:

<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>

Producción:

haga clic en evento a través del atributo onclick 2

Puede tener varios addEventListener en un elemento, pero solo uno onclick

El addEventListener le permite adjuntar múltiples eventos de clic a un elemento. Sin embargo, solo puede adjuntar un único atributo onclick a un elemento.

Mientras tanto, un elemento ejecutará todos los eventos de clic agregados a través de addEventListener. Entonces, si un elemento tiene tres eventos de clic a través de addEventListener, todos se ejecutarán cuando haga clic en el elemento.

El botón HTML tiene dos eventos de clic a través de addEventListener en el código a continuación. Al hacer clic en el botón, se ejecutarán todos los eventos de clic.

Como resultado, observará dos mensajes de alerta de JavaScript en su navegador web.

Código de ejemplo:

<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>

Producción:

eventos de múltiples clics con addEventListener

Hemos mencionado que solo puede tener un onclick en un elemento. Sin embargo, ¿qué sucede cuando tienes más de uno? ¿Qué onclick se ejecutará?

Múltiples atributos onclick se sobrescriben entre sí

Solo el último funciona si tiene múltiples onclick en un solo elemento. Esto se debe a que onclick es un atributo de elemento, por lo que solo puede existir uno en el elemento.

Por lo tanto, su navegador web solo ejecutará el último si agrega más de un onclick a un elemento.

Entonces, hemos agregado dos eventos de clic a través de onclick en el siguiente código. Mientras tanto, cuando ejecute el código en su navegador web, notará la alerta de JavaScript para el último onclick.

Código de ejemplo:

<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>

Producción:

varios onclick se sobrescriben entre sí

un valor de cadena de Element.onclick falla silenciosamente; addEventListener arroja un error

Si el valor de la función onclick en un elemento <script> es una cadena, fallará silenciosamente. Sin embargo, se produce un error si proporciona una cadena en lugar de la función en addEventListener.

En el siguiente ejemplo, tenemos la cadena ¿Decir qué? como el valor de button.onclick. Mientras tanto, la misma cadena, ¿Decir qué?, también está en la posición de la función en addEventListener.

Obtendrá un TypeError en la consola cuando ejecute el código. Además, si hace clic en el botón, no pasa nada, no hay ningún error.

Eso es porque onclick tiene un valor de cadena en lugar de una función. Mientras tanto, addEventListener ya arroja un error en la primera ejecución del código.

Código de ejemplo:

<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>

Producción:

onclick no responde al error

addEventListener le da control sobre el número de clics; Onclick está siempre disponible

addEventListener acepta un valor booleano llamado once. Este valor determina el número de veces que se ejecutará el detector.

Entonces, cuando especifica “una vez” como “true”, el detector de eventos se elimina automáticamente después de su primera ejecución. En el siguiente código, el botón tiene un evento de clic a través de onclick y addEventListener.

Mientras tanto, addEventListener tiene el booleano once establecido en true. Como resultado, cuando haga clic en el botón por primera vez, recibirá dos mensajes de alerta de JavaScript.

Sin embargo, los clics posteriores solo muestran el evento de clic de onclick. Eso es porque el addEventListener ya no existe.

Código de ejemplo:

<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>

Producción:

controlar evento con addEventListener

onclick puede causar una pérdida de memoria; addEventListener se elimina con el elemento

Cuando elimina un elemento con un evento de clic a través de onclick, el onclick y su valor permanecen en la memoria. Compruebe element.onclick en la matriz de nodos eliminados del MutationObserver para confirmar.

El elemento es el nodo eliminado con onclick adjunto. Además, tendrás que configurar un MutationObserver para lograrlo.

Los dos botones HTML tienen eventos de clic a través de onclick en el siguiente código. Mientras tanto, al hacer clic en Eliminar botón principal se elimina el Botón principal.

Sin embargo, con MutationObserver, registramos el onclick del Botón principal en la consola. Esto prueba que el onclick aún existe incluso después de eliminar el Botón principal.

<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>

Producción:

onclick pierde memoria

addEventListener no funciona en IE<9; onclick Funciona en IE<9

Si desea admitir IE<9, addEventListener no funcionará. Eso es porque IE<9 admite el attachEvent no estándar.

Sin embargo, puede escribir una función de utilidad si desea admitir IE<9. Esta función comprobará si el navegador web admite attachEvent o addEventListener.

Por lo tanto, si el navegador admite attachEvent, utilizará attachEvent; de lo contrario, usará addEventListener. Mientras tanto, siempre puede contar con onclick para trabajar en IE<9.

Por lo tanto, puede usar el siguiente código si desea admitir IE<9.

Código de ejemplo:

// 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

Artículo relacionado - JavaScript EventListener