Eventos básicos
Seguimos con el tutorial de jQuery. Hoy vamos a aprender cómo funcionan los eventos, es decir, las acciones que se desencadenan cuando los usuarios hacen algo, como pulsar un botón o pasar el cursor por alguna zona.
Ya hemos visto un poco el mecanismo básico en unidades anteriores. Se asocian como métodos a un selector y, en una función, se indican las acciones que deben ocurrir con ese evento.
- jQuery ("selector").evento (
- function () {
- sentencias
- }
- );
- jQuery("selector").evento (function () {
- sentencias
- });
Y el segundo es que, cuando lo que sucede en el evento afecta al mismo selector que lo desencadena se puede utilizar la palabra reservada this, que viene a significar «este mismo». Por ejemplo, para cambiar el color de un párrafo cuando es pulsado, podríamos escribir:
- jQuery("p").click (function () {
- jQuery(this).css ("color", "#900");
- });
Y ahora ya sí vamos con los eventos básicos.
Eventos básicos con el ratón
Los dos eventos fundamentales, cuya sintaxis se debe aprender de memoria, son:
1) .click()
La acción se desencadena (trigger) cuando se pulsa (y suelta) un elemento.
- jQuery("p").click(function () {
- jQuery(this).css ("color", "#900");
- });
2) .hover
Este es muy útil para cualquier acción relacionada con los rollovers, es decir, con cosas que pasan al pasar el cursor por un elemento. Lleva dos funciones separadas por comas, en la primero se define lo que debe suceder cuando se sitúe el cursor sobre un elemento y en la segundo la que debe pasar cuando lo abandone. Por ejemplo, este script colorearía un párrafo de rojo al pasar sobre el elemento y luego de verde al abandonarlo.
- jQuery("p").hover(
- function () {
- jQuery(this).css ("color", "#900");
- },
- function () {
- jQuery(this).css ("color", "#090");
- }
- );
Además, hay otros eventos básicos que se suelen emplear menos:
3) .dblclick
Cuando se pulsa dos veces con el ratón.
- jQuery("p").dblclick(function () {
- jQuery(this).css ("color", "#900");
- });
4) .mouseenter / .mouseout
Equivalen a .hover. Con .mouseenter ocurre la acción al entrar el cursor en un elemento y con .mouseout al salir.
- jQuery("p").mouseenter(function () {
- jQuery(this).css ("color", "#900");
- });
- jQuery("p").mouseout(function () {
- jQuery(this).css ("color", "#900");
- });
5) .mouseup / .mousedown
Son muy parecidos a .click. Con .mousedown la acción se desencadena al pulsar el ratón y con .mousedown al dejar de pulsar.
- jQuery("p").mouseup(function () {
- jQuery(this).css ("color", "#900");
- });
- jQuery("p").mousedown(function () {
- jQuery(this).css ("color", "#900");
- });
6. .mouseleave
Cuando el cursor abandona un elemento. Es muy parecido a .mouseout, pero se actúa de forma diferente si afecta a un nodo hijo. Es un matiz sobre el que ahora no vale la pena profundizar, pero si alguien está interesado puede consultar el artículo de mkyong Different Between Mouseout() And Mouseleave() In JQuery.
7. .toggle
Este evento está «deprecated», es decir, eliminado de la última versión de jQuery, por lo que me limito a enunciarlo por si alguna vez lo veis en algún script o plugin. Servía para desencadenar un evento en función de si se había pulsado ya un elemento.
Eventos básicos con el teclado
1. keypress
Cuando el usuario pulsa alguna tecla. Por ejemplo, con este código se cambiaría el párrafo cuando el usuario comenzase a escribir en el campo del formulario.
- ...
- jQuery(document).ready(function($) {
- jQuery("#formulario").keypress(function () {
- jQuery("#nombre").css("color", "#900");
- });
- ...
- <form>
- <input type="text" id="formulario">
- <p id="nombre"> Escriba su nombre </p>
- </form>
- ...
Lo mismo que en el caso anterior, pero al ser pulsada o levantada la tecla.
- jQuery("#formulario").keydown(function () {
- jQuery("#nombre").css("color", "#900");
- });
- jQuery("#formulario").keyup(function () {
- jQuery("#nombre").css("color", "#900");
- });
Eventos con el teclado o el ratón
Estos eventos, sobre todo, se usan para trabajar con formularios, un tema que veremos en profundidad más adelante, y se desencadenan cuando se sitúa el «foco» sobre un elemento, como ocurre con los campos de un formulario cuando se sitúa el curso sobre ellos para escribir.
1) .focus
Cuando se sitúa el foco
- jQuery("#formulario").focus(function () {
- jQuery("#nombre").css("color", "#900");
- });
2) .blur
Cuando se pierde el foco (muy útil para chequear que se han escrito los datos de forma correcta)
- jQuery("#formulario").blur(function () {
- jQuery("#nombre").css("color", "#900");
- });
Similares a los anteriores, pero afectan también a los nodos hijo.
Caso práctico
En la próxima entrada veremos más eventos, pero ahora vamos a poner en práctica lo aprendido con el siguiente ejercicio. ¿Cómo se podría hacer un menú desplegable con lo que ya sabemos? Es decir, un menú que al pasar el cursor se desplegaran las respectivas subopciones.
[singlepic id=17 w=406 h=142 float=center]
La respuesta es sencilla si recordamos la propiedad display de las CSS, que puede adquirir entre otros valores:
- block: para que un elemento sea visible (se comporte como un bloque)
- none: para esconder un elemento (para que no se muestre)
Tratamos de pensarlo y luego miramos la solución.
Solución
Una forma entre varias de hacerlo:
1). Primero se hacen tres bloques flotados a la izquierda, cada uno de los cuales incluye una lista desordenada a la que se le quitan todos los estilos (el margen, los cuadratines, etcétera)
- <!DOCTYPE html>
- <html>
- <head>
- <title>caso práctico</title>
- <style type="text/css">
- #menu {
- overflow: hidden;
- }
- #menu ul{
- float: left;
- list-style-type:none;
- list-style-type:none;
- padding:0em;
- width:8em;
- }
- #bloque_1 {
- border-right: 1px solid #900;
- border-left: 1px solid #f33;
- background-color:#c00;
- font-weight:bold;
- color:#fff;
- }
- #bloque_1 li {
- border-top: 1px solid #f33;
- border-bottom: 1px solid #900;
- padding:0.3em;
- }
- #bloque_2 {
- border-right: 1px solid #630;
- border-left: 1px solid #f90;
- background-color:#c60;
- font-weight:bold;
- color:#fff;
- }
- #bloque_2 li {
- border-top: 1px solid #f90;
- border-bottom: 1px solid #630;
- padding:0.3em;
- }
- #bloque_3 {
- border-right: 1px solid #390;
- border-left: 1px solid #9f6;
- background-color:#6c0;
- font-weight:bold;
- color:#fff;
- }
- #bloque_3 li {
- border-top: 1px solid #9f6;
- border-bottom: 1px solid #390;
- padding:0.3em;
- }
- </style>
- </head>
- <body>
- <nav id="menu">
- <ul id="bloque_1">
- <li>Opción 1</li>
- <li>Subopción 1.1</li>
- <li>Subopción 1.2</li>
- <li>Subopción 1.3</li>
- </ul>
- <ul id="bloque_2">
- <li>Opción 2</li>
- <li>Subopción 2.1</li>
- <li>Subopción 2.2</li>
- <li>Subopción 2.3</li>
- </ul>
- <ul id="bloque_3">
- <li>Opción 3</li>
- <li>Subopción 3.1</li>
- <li>Subopción 3.2</li>
- <li>Subopción 3.3</li>
- </ul>
- </nav>
- </body>
- </html>
Debería quedar algo similar a esta imagen:
[singlepic id=16 w=410 h=169 float=center]
2) Mediante jQuery, con el selector jerárquico prev ~ siblings se ocultan los elementos hermanos de cada bloque a partir del primer <li>, que es el que empleamos com opción principal.
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
- <script type="text/javascript">
- $.noConflict();
- jQuery(document).ready(function($) {
- jQuery("#bloque_1 li ~li").css("display", "none");
- jQuery("#bloque_2 li ~li").css("display", "none");
- jQuery("#bloque_3 li ~li").css("display", "none");
- jQuery("#bloque_1").hover(
- function(){
- jQuery("#bloque_1 li ~li").css("display", "block");
- },
- function(){
- jQuery("#bloque_1 li ~li").css("display", "none");
- }
- );
- jQuery("#bloque_2").hover(
- function(){
- jQuery("#bloque_2 li ~li").css("display", "block");
- },
- function(){
- jQuery("#bloque_2 li ~li").css("display", "none");
- }
- );
- jQuery("#bloque_3").hover(
- function(){
- jQuery("#bloque_3 li ~li").css("display", "block");
- },
- function(){
- jQuery("#bloque_3 li ~li").css("display", "none");
- }
- );
- });
- </script>
Práctica: una capa overlay
Bueno, pues, con todo lo que sabemos ya, la siguiente práctica es bien sencilla. Hay que hacer una caja (1) que se despliegue al pulsar un enlace (2), la cual debe tener además un botón cerrar (3).
Pista: conviene recordar cómo funciona la propiedad z-index.
Algo parecido a esta imagen:
[singlepic id=18 w=600 h=423 float=center]
¿Nos va gustando más jQuery? 😉
Esto cada vez se pone mejor, Gracias Marcos por este tutorial.
Las prácticas son geniales!