Esto es de suma importancia, ya que conociendo este aspecto y con ayuda del framework podemos darle un mayor dinamismo a nuestras páginas y aplicaciones web.
¿Cómo ejecutar una acción en un evento?
Esto es lo primero que debemos responder cuando trabajamos con eventos en jQuery, ya habíamos dicho que los eventos son acciones o situaciones que se detonan por el sistema o por el usuario, por ejemplo, cuando se termina de cargar el documento el sistema detona el evento ready o listo, cuando un usuario hace click sobre un elemento se detona un evento homónimo.
Con estos pequeños ejemplos en mente, podemos entonces ver la sintaxis básica para manejar cualquier tipo de evento, la cual es la siguiente:
$(selector).on("nombreEvento", function() { .... })
Recordemos o aclaremos que el selector es el nombre con el cual vamos a ubicar el elemento dentro de nuestro documento, luego con la ayuda del método .on() podemos entonces indicarle que evento debe escuchar y cuando lo detecte puede ejecutar una función anónima dentro de nuestra sección script del HTML.
Algo interesante que podemos destacar es que podemos utilizar un manejador para varios eventos, es decir, que podemos realizar una misma acción para varias situaciones, únicamente hay que listar los diferentes eventos que se deben escuchar, la sintaxis es muy similar a la que acabamos de ver.
$(selector).on("nombreEvento1 nombreEvento2 nombreEvento3 ....", function() { .... })
Atajos
Ya que sabemos lo más básico, también debemos empezar a conocer que jQuery siempre nos hará la vida más fácil como desarrolladores, por ello ha dispuesto algunos atajos para crear manejadores de eventos, con ello no tenemos que hacer la declaración completa como vimos en la parte anterior, si no que aplicamos dichos atajos directamente al selector.
Veamos algunos de los atajos más interesantes y utilizados por los desarrolladores, cabe destacar que no es la lista completa de los disponibles, para obtener dicha lista es mejor recurrir directamente a la documentación oficial, sin embargo para tener un pequeño inicio sobre el tema, estos son más que suficientes.
Un ejemplo práctico
Ya que conocemos un poco los eventos más utilizados, vamos a generar un pequeño documento que ponga en práctica algunos de ellos, ya sea en su sintaxis completa o con ejemplos, de forma que podamos experimentar con ambas formas.
En el siguiente código veremos como de forma inicial vamos a escribir con console.log() cuando tengamos el documento en ready(), luego aplicaremos otro mensaje cuando pasemos el mouse sobre un <div> para confirmar como funciona hover, finalmente veremos cómo utilizar click() y focus() para mostrar otros mensajes. Veamos el código que describe lo anterior:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ejemplo de eventos 1</title> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-40347382-1']); _gaq.push(['_trackPageview']); setTimeout(function(){ _gaq.push(['_trackEvent', 'NoBounce', '15 seconds'])},15000); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> </head> <body> <section> <p> <div id="eventoHover">Pasa el Mouse sobre este Div!!</<div> </p> <p> Escribe algo aquí: <input id="eventoClick" name="nombre" placeholder="Hazme Click" /> </p> <p> Enfocame: <input id="eventoFocus" name="apellido" placeholder="Enfocame"> </p> </section> <script type="text/javascript"> $(document).ready(function(){ console.log("El evento ready ha sucedido!!"); }); $("#eventoHover").hover(function(){ console.log("ha sucedido el evento Hover!"); }); $("#eventoClick").click(function(){ console.log("hemos detonado un evento Click <img src='http://www.solvetic.com/public/style_emoticons/default/happy.png' class='bbc_emoticon' alt=':)' />"); }); $("#eventoFocus").on("focus", function(){ console.log("hemos detonado ahora el evento focus :D"); }) </script> </body> </html>
Hemos llamado por atajos a los eventos ready(), click() y hover(), sin embargo utilizamos la sintaxis completa con focus() para que notemos como no existe diferencia en su utilización. Como podemos haber notado la sintaxis completa si es necesaria cuando queremos vincular un elemento a varios eventos.
Ahora veamos cómo se comporta en el navegador, hemos decidido el uso de console.log() para mostrar la respuesta generada por nuestros eventos, ya que es menos invasivo que alert(), además que en las consolas Javascript de Chrome o Firefox se ve con mayor facilidad, como podemos notar en la siguiente imagen desde nuestro servidor web local utilizando el navegador de Firefox Developer Edition:
Vincular un elemento a varios eventos
Esto sucede cuando queremos que un elemento tenga diferentes eventos asociados, de esta forma podemos organizar mejor nuestro código y dotar de una funcionalidad múltiple a nuestro elemento.
Existen dos posibilidades, ejecutar una misma acción para varios eventos o ejecutar una acción diferente para cada uno, de cualquier forma que deseemos tendremos que utilizar la sintaxis completa, la primera ya la hemos definido al inicio.
Veamos como vincular diferentes acciones a diferentes eventos para un mismo elemento. Para ello debemos utilizar una sintaxis base como la siguiente:
$(selector).on( { nombreEvento1: function() { ... }, nombreEvento2: function() { ... } });
Como vemos al utilizar esta forma de sintaxis nos evitamos tener que hacer algo como lo siguiente:
$(selector).atajoEvento1(function(){}); $(selector).atajoEvento2(function(){});
Lo que nos permite estar más organizados, sin embargo ambas son válidas y queda de parte del desarrollador aplicar la que más le convenga.
Poniendo en práctica lo aprendido
Ya que sabemos cómo vincular múltiples eventos a un elemento, vamos a ponerlo en práctica, vamos a seleccionar los eventos click() y focus() para este ejemplo, luego vamos a aplicarlos sobre dos elementos <input>, en el primer elemento vamos a generar la misma respuesta para cada uno de ellos, y en el segundo cada evento tendrá su propia respuesta. Veamos el código que debemos realizar para lograr nuestro objetivo:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ejemplo de eventos 2</title> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-40347382-1']); _gaq.push(['_trackPageview']); setTimeout(function(){ _gaq.push(['_trackEvent', 'NoBounce', '15 seconds'])},15000); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> </head> <body> <section> <p> Mismo resultado varios eventos: <input id="elemento1" name="nombre" placeholder="Primer elemento" /> </p> <p> Diferentes resultados por evento: <input id="elemento2" name="apellido" placeholder="Segundo Elemento"> </p> </section> <script type="text/javascript"> $("#elemento1").on("click focus",function(){ console.log("mostramos lo mismo para 3 eventos!"); }); $("#elemento2").on({ click: function(){console.log("hemos hecho click en el elemento2");}, focus: function(){console.log("hemos hecho focus en el elemento2");} }); </script> </body> </html>
Aquí vemos que debemos tener cuidado con la segunda forma de diferentes respuestas para diferentes eventos, ya que los eventos no van dentro de comillas como cuando lo hacemos en la primera forma, además que debemos encerrar dentro de corchetes {} todo lo que esté dentro del método .on(), esto es un error que puede ocurrir muy a menudo por lo que con esta precaución podemos evitarlo. Ahora veamos como luce nuestro ejemplo cuando lo ejecutamos en nuestro navegador:
Notamos el contador con un número 2 cuando ocurren los eventos sobre el primer elemento, esto quiere decir que hemos hecho una misma acción dos veces como habíamos planificado. En el segundo elemento notamos que imprimimos en consola las dos acciones determinadas, aunque también vemos que ocurren en un orden diferente del que las colocamos, esto es porque el evento de focus ocurre antes que el click en la jerarquía de eventos, sobre todo si utilizamos la tecla TAB para desplazarnos entre los campos.
Finalizando este tutorial hemos aprendido como podemos iniciarnos en el mundo del manejo de eventos con jQuery, esto es solo un abre bocas, sin embargo con estas pequeñas funcionalidades podemos lograr muchas cosas en nuestras aplicaciones.