hace 10 años
Cuando te adentras en el mundo del desarrollo web con JavaScript, te encuentras con la necesidad de hacer que tus páginas web sean interactivas. Para lograr esto, debes entender cómo manejar los eventos. Un concepto fundamental dentro del manejo de eventos es event.target. Este objeto, a menudo subestimado por principiantes, es una herramienta poderosa que te permite acceder al elemento HTML exacto que originó un evento. En este artículo, exploraremos en profundidad las propiedades de event.target, proporcionando ejemplos claros y prácticos para que puedas dominarlo y llevar tus habilidades de JavaScript al siguiente nivel.

¿Qué es event.target en JavaScript?
En esencia, event.target es una propiedad de un objeto de evento en JavaScript. Cuando ocurre un evento en un elemento HTML (como un clic, un cambio en un campo de texto o el mouse pasando por encima), se crea un objeto de evento. Este objeto contiene información detallada sobre el evento que acaba de ocurrir. event.target, dentro de este objeto de evento, siempre referencia al elemento HTML que originalmente disparó el evento. Es crucial entender que no siempre es el elemento al que se adjuntó el listener del evento, sino el elemento que realmente originó la acción.
Imagina una situación donde tienes un div contenedor y dentro de él varios botones. Si adjuntas un listener de evento de clic al div, y luego haces clic en uno de los botones, event.target dentro del listener del div será el botón que se clicó, no el div en sí. Este comportamiento, conocido como delegación de eventos, es una técnica poderosa para optimizar el rendimiento y la organización de tu código JavaScript.
Propiedades clave de event.target
event.target es un nodo del DOM (Document Object Model), y como tal, hereda todas las propiedades y métodos de los nodos del DOM. Aquí te presentamos algunas de las propiedades más útiles y comunes que puedes utilizar con event.target:
tagName: Esta propiedad te devuelve el nombre de la etiqueta HTML del elemento target en mayúsculas. Por ejemplo, si elevent.targetes un botón,event.target.tagNamedevolverá "BUTTON". Es muy útil para identificar rápidamente el tipo de elemento que originó el evento.id: Si el elemento target tiene un atributoiddefinido, esta propiedad te devolverá el valor de eseidcomo una cadena de texto. Si el elemento no tiene unid, devolverá una cadena vacía.className: Similar aid, esta propiedad te devuelve el valor del atributoclassdel elemento target como una cadena de texto. Si el elemento tiene múltiples clases, te las devolverá todas separadas por espacios. Si no tiene ninguna clase, devolverá una cadena vacía.textContentoinnerText: Estas propiedades te permiten acceder al contenido de texto del elemento target.textContentdevuelve el texto de todos los descendientes del nodo, incluyendo el texto de los elementos de script y style, mientras queinnerText, que es más específico para navegadores web, solo devuelve el texto "renderizado", respetando el estilo CSS y ocultando elementos que no son visibles. En la mayoría de los casos para manipular contenido visible,innerTextes más adecuado.value: Esta propiedad es especialmente útil cuando trabajas con elementos de formulario como<input>,<select>o<textarea>. Devuelve el valor actual del elemento del formulario. Por ejemplo, sievent.targetes un campo de texto,event.target.valuete dará el texto que el usuario ha introducido en ese campo.style: Esta propiedad te da acceso al atributostyledel elemento target como un objeto. Puedes utilizar este objeto para leer o modificar los estilos CSS en línea del elemento de manera dinámica desde JavaScript.dataset: Si has utilizado atributos de datos personalizados (atributos que comienzan condata-) en tu HTML, puedes acceder a ellos a través de la propiedaddatasetdeevent.target.datasetes un objeto donde las claves son los nombres de los atributos de datos (sin el prefijodata-) y los valores son los valores de esos atributos.attributes: Esta propiedad devuelve un objetoNamedNodeMapque contiene todos los atributos HTML del elemento target. Puedes iterar sobre este objeto para acceder a los nombres y valores de todos los atributos del elemento.
Ejemplos prácticos de event.target
Para entender mejor cómo usar event.target, veamos algunos ejemplos prácticos:
Ejemplo 1: Cambiar el color de fondo al hacer clic
const contenedor = document.getElementById('contenedor'); contenedor.addEventListener('click', function(event) { const elementoClicado = event.target; elementoClicado.style.backgroundColor = 'lightblue'; }); En este ejemplo, adjuntamos un listener de evento de clic al elemento con el id "contenedor". Cuando se hace clic en cualquier elemento dentro del contenedor, la función anónima se ejecuta. Dentro de la función, event.target representa el elemento específico que se clicó, y cambiamos su color de fondo a azul claro.

Ejemplo 2: Obtener el texto de un botón clicado
const botones = document.querySelectorAll('.mi-boton'); botones.forEach(boton => { boton.addEventListener('click', function(event) { const botonClicado = event.target; alert('Hiciste clic en el botón: ' + botonClicado.textContent); }); }); Aquí, seleccionamos todos los elementos con la clase "mi-boton" y adjuntamos un listener de evento de clic a cada uno. Cuando se clica un botón, mostramos una alerta con el texto del botón clicado, utilizando la propiedad textContent de event.target.
Ejemplo 3: Delegación de eventos para una lista
const lista = document.getElementById('lista-items'); lista.addEventListener('click', function(event) { if (event.target.tagName === 'LI') { event.target.classList.toggle('seleccionado'); } }); En este ejemplo de delegación de eventos, adjuntamos un listener de clic a la lista desordenada (<ul>) con el id "lista-items". Dentro del listener, verificamos si el event.target es un elemento de lista (<li>) usando event.target.tagName. Si es un elemento de lista, añadimos o removemos la clase "seleccionado" del elemento, permitiendo marcar o desmarcar elementos de la lista con un solo listener en el contenedor padre.
Confusión común: event.target vs. CSS target
Es importante no confundir event.target en JavaScript con la propiedad CSS target. Aunque comparten el nombre, son conceptos completamente diferentes y se utilizan en contextos distintos.

La propiedad CSS target es una propiedad abreviada que se utiliza para controlar cómo se abren los enlaces (<a>). Permite especificar si los enlaces deben abrirse en una nueva ventana, una nueva pestaña o en la misma ventana, y cómo se posiciona la nueva ventana o pestaña. Por ejemplo, target: new front; en CSS intentaría abrir todos los enlaces en una nueva ventana que se coloca al frente de otras ventanas. Sin embargo, la propiedad CSS target tiene muy poco o ningún soporte en los navegadores modernos y generalmente no se utiliza en el desarrollo web actual. Cuando se habla de controlar cómo se abren los enlaces, se suele utilizar el atributo target directamente en la etiqueta <a> en HTML (por ejemplo, <a href="..." target="_blank"> para abrir en una nueva pestaña).
En resumen, event.target en JavaScript es para identificar el elemento que originó un evento, mientras que la propiedad CSS target (que prácticamente no se usa) intentaba controlar el destino de los enlaces. Son conceptos separados y no relacionados en la práctica diaria del desarrollo web.
Event properties en general
event.target es solo una de las muchas propiedades disponibles en un objeto de evento en JavaScript. Los objetos de evento contienen una gran cantidad de información sobre el evento que ocurrió, y las propiedades disponibles varían dependiendo del tipo de evento. Algunas propiedades comunes de los objetos de evento, además de target, incluyen:
type: Indica el tipo de evento que ocurrió (por ejemplo, "click", "mouseover", "keydown").currentTarget: Referencia al elemento al que se adjuntó el listener de evento. En el contexto de la delegación de eventos,currentTargetsería el elemento contenedor al que adjuntaste el listener, mientras quetargetsería el elemento hijo que originó el evento.timeStamp: Devuelve un número que representa el momento (en milisegundos desde el inicio de la época Unix) en que ocurrió el evento.preventDefault(): Un método que puedes llamar en el objeto de evento para prevenir la acción por defecto asociada con el evento. Por ejemplo, en un evento de envío de formulario (submit),event.preventDefault()evitará que el formulario se envíe de la manera tradicional, permitiéndote manejar el envío con JavaScript.stopPropagation(): Un método para detener la propagación del evento a través del DOM. Normalmente, los eventos en el DOM tienen una fase de "burbujeo" (bubbling) en la que el evento se propaga hacia arriba en el árbol del DOM desde el elemento target hasta el elemento raíz.stopPropagation()detiene esta propagación.clientXyclientY: Para eventos de ratón, estas propiedades proporcionan las coordenadas X e Y del puntero del ratón en el momento en que ocurrió el evento, relativas al área visible del navegador (viewport).keyykeyCode: Para eventos de teclado, estas propiedades proporcionan información sobre la tecla que se presionó.keydevuelve una cadena que representa la tecla presionada (por ejemplo, "Enter", "a", "Shift"), mientras quekeyCodedevuelve un número que representa el código de la tecla (aunquekeyCodeestá en desuso en favor dekeyycode).
Explorar las propiedades específicas de los objetos de evento para diferentes tipos de eventos te permitirá crear interacciones web mucho más ricas y personalizadas.

event.target en React
En React, event.target funciona de manera muy similar a como lo hace en JavaScript vanilla. Cuando manejas eventos en React, el objeto de evento que se pasa a tus handlers de eventos es un evento sintético que React envuelve alrededor del evento nativo del navegador. Sin embargo, event.target dentro de un evento sintético de React sigue referenciando al elemento del DOM que originó el evento.
La pregunta planteada sobre cómo dar borde a un div en un componente padre de React cuando se hace clic en un input dentro de un componente hijo, no se resuelve directamente con event.target. Si bien event.target te dará el input que se clicó, necesitas un mecanismo para comunicar este evento desde el componente hijo al componente padre para que el padre pueda modificar su propio estilo. Esto se suele lograr utilizando props de callback o gestión de estado compartido (como Context API o bibliotecas de gestión de estado como Redux o Zustand). En React, el enfoque se centra más en la comunicación entre componentes y la gestión del estado de la aplicación que en manipular directamente el DOM utilizando event.target para interacciones complejas entre componentes anidados.
Conclusión
event.target es una propiedad fundamental para entender y manipular la interacción del usuario en tus páginas web con JavaScript. Dominar sus propiedades y cómo utilizarlo en diferentes escenarios, incluyendo la delegación de eventos, te permitirá escribir código más eficiente, organizado y reactivo. Aunque a veces se confunde con la propiedad CSS target (que es obsoleta), event.target en JavaScript sigue siendo una herramienta esencial en el arsenal de cualquier desarrollador web moderno. Explora las diferentes propiedades de event.target, experimenta con ejemplos prácticos y verás cómo puedes llevar la interactividad de tus proyectos web a un nuevo nivel.
