¿Cómo utilizar target en JS?

Descifrando event.target en JavaScript: La clave para eventos interactivos

hace 2 años

Valoración: 3.97 (7955 votos)

En el vasto universo de JavaScript, la gestión de eventos es fundamental para crear páginas web interactivas y dinámicas. Cuando un usuario interactúa con un elemento en la página, como hacer clic en un botón o escribir en un campo de texto, se desencadena un evento. Para poder responder adecuadamente a estas interacciones, necesitamos saber exactamente qué elemento fue el que originó el evento. Aquí es donde entra en juego la propiedad event.target, una herramienta esencial para cualquier desarrollador web.

Índice de Contenido

¿Qué es event.target? El elemento objetivo del evento

Imagina que tienes una estructura HTML compleja, con elementos anidados dentro de otros. Por ejemplo, un <div> que contiene un <em> y dentro de este, un <code>. Si asignas un manejador de eventos onclick al <div> padre, y el usuario hace clic en el <code>, ¿qué elemento se considera el objetivo del evento?

La respuesta es sencilla: event.target siempre apunta al elemento que originalmente desencadenó el evento. En nuestro ejemplo, si haces clic en <code>, aunque el manejador esté en el <div>, event.target será el elemento <code>. Esto es crucial para entender cómo se propagan los eventos en el DOM (Modelo de Objetos del Documento).

¿Qué es el evento target?
event. target – es el elemento “objetivo” que inició el evento, no cambia a través de todo el proceso de propagación. this – es el elemento “actual”, el que tiene un manejador ejecutándose en el momento. Oct 24, 2022

Propagación de eventos: Burbujeo (Bubbling)

Para entender mejor event.target, es vital comprender el concepto de propagación de eventos, específicamente el burbujeo (bubbling). Cuando ocurre un evento en un elemento, como un clic, este evento no se limita a ese elemento. En lugar de eso, el evento "burbujea" hacia arriba en la jerarquía del DOM, activando los manejadores de eventos de sus elementos padres, abuelos, y así sucesivamente hasta llegar al elemento raíz del documento (document).

Consideremos el siguiente ejemplo:

<style> body * { margin: 10px; border: 1px solid blue; } </style> <form onclick="alert('form')">FORM <div onclick="alert('div')">DIV <p onclick="alert('p')">P</p> </div> </form> 

Si haces clic en el elemento <p>, verás tres alertas en secuencia: "p", "div", y "form". Esto sucede porque el evento click se origina en <p>, luego burbujea a su padre <div>, y finalmente al padre de este, <form>. En cada paso, se ejecuta el manejador de eventos onclick asociado.

event.target vs. this (o event.currentTarget)

Es importante distinguir event.target de this (o event.currentTarget). Aunque ambos están relacionados con el evento, representan cosas diferentes:

  • event.target: Siempre es el elemento original que desencadenó el evento. No cambia durante la fase de propagación. En nuestro ejemplo anterior, si haces clic en <p>, event.target siempre será <p>, sin importar si el manejador se está ejecutando en <p>, <div> o <form>.
  • this (o event.currentTarget): Es el elemento actual cuyo manejador de eventos se está ejecutando en ese momento. En el contexto del manejador de eventos, this y event.currentTarget se refieren al mismo elemento. En nuestro ejemplo, dentro del manejador de <form>, this será <form>, dentro del manejador de <div>, this será <div>, y así sucesivamente.

Para ilustrar mejor la diferencia, considera el siguiente código:

<form id="form" style="background-color: green; position: relative; width: 150px; height: 150px; text-align: center; cursor: pointer;">FORM <div style="background-color: blue; position: absolute; top: 25px; left: 25px; width: 100px; height: 100px;">DIV <p style="background-color: red; position: absolute; top: 25px; left: 25px; width: 50px; height: 50px; line-height: 50px; margin: 0;">P</p> </div> </form> <script> form.onclick = function(event) { event.target.style.backgroundColor = 'yellow'; setTimeout(() => { alert("target = " + event.target.tagName + ", this=" + this.tagName); event.target.style.backgroundColor = ''; }, 0); }; </script> 

Si haces clic en el elemento <p>, el fondo de <p> se volverá amarillo temporalmente, y luego aparecerá una alerta que mostrará: target = P, this=FORM. Esto demuestra que, aunque el evento se originó en <p> (por lo tanto, event.target es <p>), el manejador onclick se ejecutó en <form> (por lo tanto, this es <form>).

¿Qué es la propiedad Target?
La propiedad target de la interfaz del event. currentTarget es una referencia al objeto en el cual se lanzo el evento. Es diferente de event. currentTarget donde el controlador de eventos (event handler) es llamado durante la fase de bubbling or capturing del evento. Dec 17, 2024

Deteniendo la propagación: event.stopPropagation() y event.stopImmediatePropagation()

En ocasiones, puede que desees evitar que un evento se propague hacia arriba en la jerarquía del DOM. Para ello, puedes utilizar el método event.stopPropagation(). Al llamar a este método dentro de un manejador de eventos, detendrás la fase de burbujeo, impidiendo que los manejadores de eventos de los elementos padres se ejecuten.

Por ejemplo:

<body onclick="alert(`No se propagó hasta aquí`)"> <button onclick="event.stopPropagation()">Haz clic</button> </body> 

En este caso, al hacer clic en el botón, solo se ejecutará el manejador de eventos del botón (que llama a event.stopPropagation()), y no se mostrará la alerta del <body>, ya que la propagación se detiene.

Existe también event.stopImmediatePropagation(), que es aún más restrictivo. Además de detener la propagación hacia arriba, también impide que se ejecuten otros manejadores de eventos en el mismo elemento para el mismo evento. Si un elemento tiene múltiples manejadores para un mismo evento, y uno de ellos llama a event.stopImmediatePropagation(), ninguno de los manejadores restantes en ese elemento se ejecutará.

¡Cuidado al usar event.stopPropagation()! Detener la propagación puede tener consecuencias inesperadas y dificultar la depuración. Úsalo con moderación y solo cuando sea absolutamente necesario y bien justificado en la arquitectura de tu aplicación.

¿Qué hace e-target?
Un evento se activa cuando un usuario interactúa con un elemento de entrada, como escribir en un campo de texto o hacer clic en un botón. La propiedad e. target dentro del controlador de eventos otorga acceso al elemento DOM específico involucrado, lo que permite a los desarrolladores leer su estado actual, generalmente a través de la propiedad value para los campos de entrada .

Fases del evento: Captura, Objetivo y Propagación

El procesamiento de eventos en el DOM se divide en tres fases:

  1. Fase de Captura (Capturing Phase): El evento viaja desde la raíz del documento (window o document) hacia el elemento objetivo.
  2. Fase de Objetivo (Target Phase): El evento alcanza el elemento objetivo, y se ejecutan los manejadores de eventos definidos en este elemento.
  3. Fase de Propagación (Bubbling Phase): El evento "burbujea" hacia arriba desde el elemento objetivo hasta la raíz del documento, ejecutando los manejadores de eventos en los elementos padres en el camino.

Por defecto, los manejadores de eventos en JavaScript se adjuntan y se ejecutan durante la fase de propagación. Sin embargo, es posible adjuntar manejadores que se ejecuten durante la fase de captura utilizando el método addEventListener con la opción capture: true como tercer argumento:

elem.addEventListener(tipoEvento, manejador, true); // o { capture: true } 

Para ilustrar las fases de captura y propagación, considera el siguiente ejemplo:

<style> body * { margin: 10px; border: 1px solid blue; } </style> <form>FORM <div>DIV <p>P</p> </div> </form> <script> for(let elem of document.querySelectorAll('*')) { elem.addEventListener("click", e => alert(`Captura: ${elem.tagName}`), true); elem.addEventListener("click", e => alert(`Propagación: ${elem.tagName}`)); } </script> 

Al hacer clic en <p>, verás una secuencia de alertas que muestra el orden de las fases: primero la fase de captura (desde HTML hasta DIV), y luego la fase de propagación (desde P hasta HTML). Observa que <p> aparece dos veces porque tiene manejadores tanto en la fase de captura como en la de propagación.

La propiedad event.eventPhase te indica en qué fase se encuentra el evento actualmente (1 para captura, 2 para objetivo, 3 para propagación), aunque rara vez se utiliza directamente.

Removiendo manejadores de captura

Si has añadido un manejador de eventos en la fase de captura con addEventListener(..., true), debes especificar true también al removerlo con removeEventListener(..., true) para que se elimine correctamente.

Orden de ejecución de manejadores

Si un mismo elemento tiene múltiples manejadores para el mismo evento y en la misma fase (ya sea captura o propagación), se ejecutarán en el orden en que fueron asignados mediante addEventListener.

¿Qué es el evento target?
event. target – es el elemento “objetivo” que inició el evento, no cambia a través de todo el proceso de propagación. this – es el elemento “actual”, el que tiene un manejador ejecutándose en el momento. Oct 24, 2022

Conclusión: El poder de event.target

event.target es una propiedad fundamental en JavaScript para la gestión de eventos en el DOM. Permite identificar con precisión el elemento que originó un evento, incluso en estructuras HTML complejas con propagación de eventos. Comprender la diferencia entre event.target y this, así como las fases de captura y propagación, es esencial para escribir código JavaScript robusto, interactivo y eficiente.

La capacidad de acceder al elemento objetivo del evento abre un abanico de posibilidades para la manipulación del DOM y la creación de interfaces de usuario dinámicas. Desde validar formularios hasta crear menús desplegables complejos, event.target es una herramienta indispensable en el arsenal de cualquier desarrollador web JavaScript.

Dominar event.target y la gestión de eventos es un paso crucial para convertirte en un desarrollador web más competente y crear aplicaciones web más interactivas y atractivas para el usuario.

Subir