Trabajar con eventos es una forma totalmente nueva de controlar el flujo de una aplicación. Es la primera vez que tu código no se ejecutará en un flujo lineal. En su lugar, se ejecutará de forma asíncrona. ¿Quién sabe qué es lo primero?
En su lugar, tu código ahora se ejecutará asincrónicamente (es decir, algunas partes del código no funcionarán cuando el resto del código circundante se esté ejecutando, pero solo cuando se activan explícitamente). ¿Quién sabe qué viene primero?
Un evento es algo que sucede! Como hacer clic en un botón, presionar una tecla en el teclado, pasar un div
con el mouse, etc.
Tu trabajo como desarrollador es prepararte para esos eventos y definir las funciones que van a manejar esos eventos.
A veces es el usuario del sitio web, a veces es el navegador, a veces es otra aplicación que le permite saber algo, a veces el desarrollador desencadena eventos relacionados con la lógica empresarial, etc.
Hay docenas de eventos que se activan cada minuto, pero no tienes que hacer nada al respecto (no si no quieres). Están disponibles para usted según el tipo de aplicación que desee hacer.
Estos son algunos de los tipos de eventos que se activan constantemente (y usted puede escucharlos):
Tipo de Datos | Descripción |
---|---|
Clic | Cuando el usuario hace clic con el mouse o el dedo en cualquier elemento HTML. |
Mouseover, Mouseout | El evento ocurre cuando el puntero se mueve hacia dentro (para el mouseover) o hacia afuera (para el mouseout) un elemento, o uno de sus hijos. |
contextmenu | Cuando el usuario hace clic derecho en el mouse. |
Mousemove | Si el usuario mueve el mouse. |
Mousedown or Mouseup | Si el usuario presiona o suelta el mouse. |
☝️ Juega con esta demo aquí
Tipo de Datos | Descripción |
---|---|
Load | El navegador ha terminado de cargar el sitio web. |
Error | El evento ocurre cuando se produce un error al cargar un archivo externo (como un CSS o un JavaScript). |
Scroll | El evento se produce cuando la vista del documento o un elemento es deslizado. |
PageHide PageShow | Cuando el usuario se enfoca en una ventana / pestaña diferente; o cuando el usuario vuelve de una ventana / pestaña diferente. |
Resize | Cuando la ventana se redimensiona. |
☝️ Juega con esta demo aquí
Tipo de Datos | Descripción |
---|---|
Submit | El evento ocurre cuando se envía un formulario. |
Focusin and Focusout | El evento ocurre cuando el puntero se mueve a un elemento o a uno de los elementos secundarios del elemento. |
Input | El evento ocurre cuando un elemento obtiene la entrada del usuario. |
Change | El evento ocurre cuando el contenido de un elemento del formulario, la selección o el estado previamente establecido han cambiado (para <input> , <keygen> , <select> , y <textarea> ) |
|
☝️ Juega con esta demo aquí
Tipo de Datos | Descripción |
---|---|
Keyup | Cuando el usuario suelta la tecla del teclado. |
Keydown | Cuando el usuario presiona la tecla del teclado. |
Keypress | Cuando el usuario presiona y suelta la tecla del teclado. La diferencia de keydown / up es que Keypress solo funciona con teclas de caracteres. Por ejemplo, no funciona en las flechas arriba |
☝️Juega con esta demo aquí
🔗 Aquí puedes encontrar una lista con todos los otros eventos menos comunes que tiene a su disposición. Léalos rápidamente y sé consciente de ellos para futuras referencias durante tu vida como desarrollador.
Ahora que sabes qué eventos hay, puedes comenzar a escucharlos cuando lo desees durante el tiempo de ejecución. La única forma de reaccionar ante cualquier evento es escuchar ese evento y asignar una función que maneje el evento como lo necesite.
Repitamos: Para reaccionar necesitas escuchar… Y para escuchar necesitas especificar una función handler. Llamamos a esa construcción un Event Listener.
Puedes agregar un detector de eventos de 2 maneras diferentes:
Por ejemplo, si desea empezar a escuchar cuando el usuario hace clic en un botón en particular todo lo que tiene que hacer es especificar el atributo "onclick" para esa etiqueta HTML específica < button>
, así:
1<!– myClickHandler is a javascript function that will handle the event –> 2<button onclick="myClickHandler();">Click me</button> 3 4<script> 5function myClickHandler(){ 6 alert(‘hello’); 7} 8</script>
A veces el elemento DOM no existe desde el principio. Tal vez se crean después de una llamada a la base de datos o después de que el usuario haya hecho algo. Para resolver ese problema, debe comenzar a escuchar después de crear los nuevos elementos.
La función .addEventListener
es perfecta para esto porque se puede usar en cualquier elemento DOM durante el tiempo de ejecución.
Al usar la función .addEventListener
, debe especificar qué evento quiere escuchar, y la función controladora que se llamará cada vez que ese evento se active en ese elemento DOM.
Por ejemplo, el siguiente código está creando una lista de nombres, y cada LI está escuchando el evento "clic", que luego activa la eliminación del mismo LI:
Las funciones handler de eventos pueden recibir un parámetro opcional en su declaración, que la mayoría de los desarrolladores denominan event, evt o simplemente e. Este parámetro siempre se completa con el "Objeto de evento" que se envía de forma predeterminada desde cada evento y contiene información importante sobre el evento que se activó, el elemento donde ocurrió, su valor, etc.
No importa qué tipo de evento (eventos relacionados con el mouse, evento de teclado, marco, etc.), el objeto de evento siempre tendrá al menos las siguientes propiedades:
1function myEventHandler(eventObj) 2{ 3 console.log(eventObj.target); 4 //imprimirá en la consola del objeto DOM que ha activado el evento 5 console.log(eventObj.type); 6 //Imprimirá en la consola el tipo de evento. 7 console.log(eventObj.cancelable); 8 //Imprimirá en la consola verdadero o falso si podemos detener la propagación de este evento. 9 eventObj.preventDefault(); 10 //Evitará la acción predeterminada del evento si está permitido 11 eventObj.stopPropagation(); 12 //Evitará la propagación del evento si está permitido 13 14}
Propiedades | Descripción |
---|---|
Objetivo | Devuelve el objeto DOM que ha activado el evento. |
Tipo | El tipo de evento: haga clic en, al pasar el ratón, carga, etc . |
Cancelable | Si puede detener la propagación del evento o no. |
preventDefault() | Si el evento se puede cancelar, este método detiene la acción predeterminada del mismo; por ejemplo, al evitar un evento de "submit" de un formulario, el formulario no se enviará, lo que puede ser útil si el formulario tiene errores que deben corregirse, etc. |
stopPropagation() | Evita que un evento se propague (es decir, que desencadene el mismo evento en elementos anidados o principales). |
Dependiendo del tipo de evento, tendrá propiedades adicionales que le darán información muy útil sobre lo que sucedió cuando se activó el evento.
Una de las propiedades adicionales más importantes es la propiedad target.value de los objetos de evento relacionados con los campos de entrada (input). Nos permite capturar y guardar la entrada del usuario de los elementos de entrada.
Puedes hacerlo pasando el argumento 'event' en la función de controlador de eventos en línea onchange
:
1 2<input type="text" onchange="myChangeHandler(event)" /> 3 4<script> 5const myChangeHandler = (e) => { 6 console.log(e.target.value); 7 // Imprimirá en la consola lo que el usuario escriba en el campo de entrada 8} 9</script> 10
O puedes hacerlo con addEventListener
:
index.html:
1 <input type="text" />
index.js:
1 //index.js file: 2 const myChangeHandler = (e) => { 3 console.log(e.target.value); 4 } 5 6 document.querySelector("input").addEventListener('change', myChangeHandler); 7
Ten en cuenta que en addEventListener() solo hacemos referencia a la función (myChangeHandler
) y no la llamamos (myChangeHandler()
). Si la llamas, se ejecutará automáticamente cuando se cargue la página y no esperará a que se gatille/desencadene un evento y ese no es el objetivo. Por lo tanto, no necesitamos pasar el objeto de evento (event object) como argumento allí (no hay paréntesis). AddEventListener pasa automáticamente el objeto de evento a la función que lo controla (handler function).
Propiedades | Descripción |
---|---|
clientX, clientY | Devuelve la horizontal o vertical de coordenadas del puntero del mouse, con relación a la ventana actual, cuando el evento de mouse fue provocada. |
pageX, pageY | Devuelve la horizontal o vertical de coordenadas del puntero del mouse, en relación con el documento, cuando el evento del mouse fue provocado. |
which | Devuelve qué botón del mouse cuando se presiona el evento de ratón se desencadenó |
Propiedades | Descripción |
---|---|
keyCode | Devuelve el código de caracteres Unicode de la tecla que activa el evento. |
shiftKey, altKey or ctrlKey | Devuelve si el shift ,alt o ctrl se pulsan cuando el evento clave fue provocado. |
Propiedades | Descripción |
---|---|
deltaX, deltaY | Devuelve la cantidad de desplazamiento vertical u horizontal de una rueda del ratón ( eje y) o (eje x) |
deltaMode | Devuelve un número que representa la unidad de mediciones de valores delta (píxeles, líneas o páginas) |
🔗 Hay mucha más información que puedes obtener del objeto de evento, pero nos estamos enfocando en las propiedades más utilizadas. Para una lista más grande de propiedades por favor lee esta guía.
¿Qué pasa si no quiero seguir escuchando? Todos los navegadores modernos eliminan los oyentes de eventos cuando se elimina el elemento DOM en el que se aplicaron. Pero si no deseas eliminar el elemento DOM, puedes eliminar el oyente de forma manual utilizando la función .removeEventListener()
.
1element.removeEventListener(type, eventHandlerFunction);
Tienes que utilizar los mismos parámetros exactos en la función removeEventListener de que los que utilizan en la función addEventListener.
He aquí un ejemplo:
En este código, se añade un detector de eventos para el evento clic, pero luego, la primera vez que el detector de clic se llama a la función de controlador, elimina el detector de eventos desde el botón. Es por eso que la segunda vez que se hace clic en el botón, no pasa nada.