Which of the following are examples of HTML events?

Obtener Elemento de Evento en JavaScript

hace 10 años

★★★★★Valoración: 4.58 (3697 votos)

En el mundo del desarrollo web con JavaScript, los eventos juegan un papel fundamental para crear páginas interactivas y dinámicas. Cuando un usuario interactúa con una página web, ya sea haciendo clic, moviendo el ratón o presionando una tecla, se desencadenan eventos. Para poder manipular y responder a estas interacciones, es crucial saber cómo identificar y acceder al elemento HTML que originó el evento. JavaScript nos proporciona mecanismos sencillos y poderosos para lograr esto, principalmente a través de las propiedades event.target y event.currentTarget. En este artículo, exploraremos en detalle cómo utilizar estas propiedades, sus diferencias y cómo aplicarlas en situaciones prácticas para construir aplicaciones web más interactivas y receptivas.

How to get element from event in JavaScript?
The target property returns the element where the event occured. The target property is read-only. The target property returns the element on which the event occurred, opposed to the currentTarget property, which returns the element whose event listener triggered the event.
Índice de Contenido

Entendiendo los Eventos en JavaScript

Antes de sumergirnos en cómo obtener el elemento de un evento, es importante recordar brevemente qué son los eventos en JavaScript. Un evento es una señal que indica que algo ha ocurrido en el navegador. Estos eventos pueden ser iniciados por el usuario (como un clic o pulsación de tecla), por el navegador (como la carga de una página o un error), o incluso por el propio código JavaScript. Cada evento está asociado a un elemento del DOM (Document Object Model), que es la representación estructurada de la página web.

Cuando se produce un evento en un elemento, se genera un objeto evento. Este objeto contiene información detallada sobre el evento, incluyendo el tipo de evento (click, mouseover, keypress, etc.), el elemento en el que ocurrió y otros datos relevantes. Para acceder a esta información y reaccionar al evento, utilizamos los event listeners o escuchadores de eventos. Estos escuchadores son funciones que asociamos a un elemento específico y que se ejecutan cuando ocurre un determinado evento en ese elemento.

Accediendo al Elemento Origen del Evento con event.target

La propiedad event.target es la forma más directa y común de obtener el elemento HTML que desencadenó el evento. `event.target` siempre hace referencia al elemento que originalmente emitió el evento, independientemente de cómo se haya delegado el evento o dónde se haya adjuntado el listener.

Veamos un ejemplo sencillo para ilustrar esto. Imaginemos que tenemos el siguiente código HTML:

<div id="contenedor"> <button id="boton1">Botón 1</button> <button id="boton2">Botón 2</button> </div> 

Y el siguiente código JavaScript:

const contenedor = document.getElementById('contenedor'); contenedor.addEventListener('click', function(event) { const elementoClicado = event.target; console.log('Elemento clicado:', elementoClicado); console.log('Nombre de la etiqueta:', elementoClicado.tagName); }); 

En este ejemplo, hemos adjuntado un listener de evento `click` al elemento `div` con el id "contenedor". Cuando se hace clic en cualquier parte dentro del `div`, incluyendo los botones, la función listener se ejecutará. Dentro de la función, `event.target` nos dará el elemento exacto que fue clicado, ya sea el `div` contenedor o uno de los botones.

Si hacemos clic en "Botón 1", la consola mostrará:

Elemento clicado: <button id="boton1">Botón 1</button> Nombre de la etiqueta: BUTTON 

Si hacemos clic en "Botón 2", la consola mostrará:

Elemento clicado: <button id="boton2">Botón 2</button> Nombre de la etiqueta: BUTTON 

Si hacemos clic en el espacio vacío dentro del `div` pero fuera de los botones, la consola mostrará:

Elemento clicado: <div id="contenedor">...</div> Nombre de la etiqueta: DIV 

Como podemos observar, event.target siempre apunta al elemento más interno que originó el evento, es decir, el elemento que fue realmente clicado.

Comprendiendo event.currentTarget y la Delegación de Eventos

Ahora, exploremos event.currentTarget. Esta propiedad es similar a `event.target` pero con una diferencia crucial que se vuelve importante cuando trabajamos con la delegación de eventos. `event.currentTarget` siempre hace referencia al elemento al que se adjuntó el event listener. En el ejemplo anterior, sin importar dónde hagamos clic dentro del `div` contenedor, `event.currentTarget` siempre será el elemento `div` con id "contenedor", ya que es a este elemento al que hemos adjuntado el listener de evento.

La delegación de eventos es una técnica poderosa en JavaScript que permite manejar eventos de múltiples elementos adjuntando un único listener a un elemento padre común. Esto es especialmente útil cuando se tienen muchos elementos similares que requieren la misma gestión de eventos, o cuando los elementos se añaden dinámicamente al DOM.

Volviendo a nuestro ejemplo anterior, si modificamos ligeramente el código JavaScript para mostrar también `event.currentTarget`:

const contenedor = document.getElementById('contenedor'); contenedor.addEventListener('click', function(event) { const elementoClicado = event.target; const elementoListener = event.currentTarget; console.log('Elemento clicado (event.target):', elementoClicado); console.log('Elemento listener (event.currentTarget):', elementoListener); }); 

Ahora, al hacer clic en cualquier parte dentro del `div` contenedor, la consola mostrará algo similar a esto (dependiendo de dónde se haga clic):

Elemento clicado (event.target): <button id="boton1">Botón 1</button> (o <button id="boton2">Botón 2</button> o <div id="contenedor">...</div>) Elemento listener (event.currentTarget): <div id="contenedor">...</div> 

Como vemos, `event.target` varía dependiendo del elemento preciso que se haya clicado, mientras que `event.currentTarget` siempre se mantiene constante, apuntando al `div` contenedor, que es donde hemos adjuntado el listener.

Diferencias Clave entre event.target y event.currentTarget

Para resumir las diferencias clave entre event.target y event.currentTarget, podemos destacar:

  • event.target: Siempre representa el elemento que originó el evento. Es el elemento más interno en la jerarquía del DOM que desencadenó el evento.
  • event.currentTarget: Siempre representa el elemento al que se adjuntó el event listener. Permanece constante durante la fase de bubbling del evento.

La elección entre usar `event.target` o `event.currentTarget` dependerá del escenario y de lo que queramos lograr en nuestro código. Si necesitamos saber exactamente qué elemento fue interactuado, utilizaremos `event.target`. Si estamos utilizando delegación de eventos y necesitamos referirnos al elemento al que hemos adjuntado el listener, utilizaremos `event.currentTarget`.

Ejemplos Prácticos de Uso

Veamos algunos ejemplos prácticos para consolidar la comprensión de `event.target` y `event.currentTarget`:

Ejemplo 1: Listado de Tareas Interactivo

Imaginemos una lista de tareas donde cada tarea es un elemento `li` dentro de un `ul`. Queremos que al hacer clic en una tarea, se marque como completada. Podemos usar delegación de eventos para adjuntar un único listener al `ul` y utilizar `event.target` para identificar la tarea específica que fue clicada.

<ul id="lista-tareas"> <li>Comprar pan</li> <li>Estudiar JavaScript</li> <li>Hacer ejercicio</li> </ul> 
const listaTareas = document.getElementById('lista-tareas'); listaTareas.addEventListener('click', function(event) { if (event.target.tagName === 'LI') { event.target.classList.toggle('completada'); } }); 

En este ejemplo, el listener está adjunto al `ul` (`listaTareas`). Cuando se hace clic en un `li`, `event.target` será el `li` clicado. Verificamos si el `tagName` de `event.target` es 'LI' para asegurarnos de que solo reaccionamos a clics en los elementos de la lista, y luego toggledmos la clase 'completada' para marcarla visualmente.

Ejemplo 2: Manejando Clics en una Tabla

Consideremos una tabla HTML y queremos detectar cuando se hace clic en una celda (`td`) específica. Podemos usar delegación de eventos en la tabla y `event.target` para identificar la celda clicada.

<table id="mi-tabla" border="1"> <tbody> <tr><td>Celda 1</td><td>Celda 2</td></tr> <tr><td>Celda 3</td><td>Celda 4</td></tr> </tbody> </table> 
const miTabla = document.getElementById('mi-tabla'); miTabla.addEventListener('click', function(event) { if (event.target.tagName === 'TD') { console.log('Celda clicada:', event.target.textContent); } }); 

Aquí, el listener está adjunto a la tabla (`miTabla`). Cuando se hace clic en un `td`, `event.target` será el `td` clicado. Verificamos que `tagName` sea 'TD' y mostramos el contenido de texto de la celda en la consola.

Tabla Comparativa: event.target vs event.currentTarget

Característicaevent.targetevent.currentTarget
Elemento ReferenciadoElemento que originó el eventoElemento al que se adjuntó el listener
ConsistenciaVaría según el elemento que desencadena el eventoConstante, siempre el elemento listener
Uso principalIdentificar el elemento exacto interactuadoReferenciar al elemento listener en delegación de eventos
EscenariosEventos directos en un elemento específico, identificar el objetivo preciso del eventoDelegación de eventos, listeners adjuntos a elementos padre para manejar eventos de elementos hijos

Preguntas Frecuentes (FAQ)

  1. ¿Qué pasa si tengo listeners de eventos en elementos anidados? ¿Cómo interactúan event.target y event.currentTarget?

    En un escenario de elementos anidados con listeners de eventos, `event.target` siempre apuntará al elemento más interno que originó el evento, mientras que `event.currentTarget` cambiará en cada fase del bubbling del evento, apuntando al elemento al que está adjunto el listener en cada nivel de la jerarquía.

  2. ¿Puedo modificar event.target o event.currentTarget?

    No, tanto `event.target` como `event.currentTarget` son propiedades de solo lectura. No puedes modificarlas directamente.

  3. ¿En qué tipos de eventos puedo utilizar event.target y event.currentTarget?

    Puedes utilizar `event.target` y `event.currentTarget` en prácticamente todos los tipos de eventos del DOM, como eventos del ratón (click, mouseover, mouseout), eventos del teclado (keypress, keydown, keyup), eventos de formulario (submit, change), y muchos más.

  4. ¿Cuándo es más apropiado usar event.currentTarget en lugar de event.target?

    Es más apropiado usar `event.currentTarget` cuando estás utilizando la técnica de delegación de eventos y necesitas referirte al elemento padre al que adjuntaste el listener, en lugar del elemento hijo específico que desencadenó el evento.

  5. ¿Cómo puedo obtener el elemento padre de event.target si lo necesito?

    Puedes obtener el elemento padre de `event.target` utilizando la propiedad `parentNode` de `event.target`. Por ejemplo: `event.target.parentNode`.

Conclusión

Dominar el manejo de eventos es fundamental para crear páginas web interactivas y dinámicas con JavaScript. Comprender la diferencia entre event.target y event.currentTarget es crucial para trabajar eficazmente con eventos, especialmente cuando se utiliza la delegación de eventos. event.target nos da el elemento preciso que originó el evento, mientras que event.currentTarget nos proporciona el elemento al que se adjuntó el listener. Utilizando estas propiedades de manera adecuada, podemos escribir código JavaScript más eficiente, legible y mantenible, creando experiencias de usuario ricas y responsivas en la web.

Subir