Manual de Jquery Español
Manual de Jquery Español
Manual de jQuery
Manual de jQuery
Manual de jQuery
Demo 1 de jQuery
Para empezar vamos a ver este ejemplo, donde tenemos dos botones y un texto. Al pulsar un botn, cambiaremos el texto y al pulsar el otro pondremos otro texto distinto. Podemos ver el ejemplo en marcha en una pgina aparte. En este ejemplo tenemos una capa que tiene este cdigo <div id="capa" style="padding: 10px; background-color: #ff8800">Haz clic en un botn</div> Luego tenemos dos botones con estos cdigos: <input type="button" value="Botn A" onclick="$('#capa').html('Has hecho clic en el botn <b>A</b>')"> <input type="button" value="Botn B" onclick="$('#capa').html('Recibido un clic en el botn <b>B</b>')"> Como se puede ver, en los botones hay definidos un par de eventos onclick (uno en cada uno) que ejecutan una instruccin Javascript cuando se hace clic sobre ellos. La instruccin est en Javascript, pero hace uso de algunas herramientas disponibles en jQuery para trabajo con los elementos de la pgina. En este caso, por explicarlo rpidamente, se hace una seleccin del elemento DIV de la capa y luego se ejecuta un mtodo sobre l para cambiar el contenido HTML del elemento.
Demo 2 de jQuery
En este otro ejemplo vamos a ver algo un poquito ms complejo. Bueno, realmente no tiene mucha mayor complejidad, pero estamos utilizando jQuery de una manera un poco distinta, que requiere algo ms de cdigo por nuestra parte. Ahora vamos a tener dos capas en nuestra pgina. Una capa estar siempre visible y otra capa aparecer inicialmente oculta y la vamos a mostrar u ocultar dependiendo de si el usuario coloca el ratn encima de la capa que est siempre visible. Para hacerse una idea exacta de nuestro ejemplo puedes verlo en una ventana aparte. En este segundo ejemplo tenemos este cdigo HTML, con las dos capas.
Manual de jQuery
<div id="capa" style="padding: 10px; background-color: #ff8800;">Pon el ratn encima de esta capa</div> <br> <div id="mensaje" style="display: none;">Has puesto el ratn encima!! <br>(Ahora qutalo de la capa)</div>
Ahora vamos a tener un cdigo Javascript con jQuery que defina los eventos del usuario, para cuando sita el ratn dentro o fuera de la primera capa. $("#capa").mouseenter(function(evento){ $("#mensaje").css("display", "block"); }); $("#capa").mouseleave(function(evento){ $("#mensaje").css("display", "none"); }); De esta sencilla manera, hemos creado dos eventos en el DIV con id="capa". Adems, hemos definido el cdigo de los eventos por medio de funciones, que se encargarn de mostrar o ocultar la segunda capa con id="mensaje". $("#mensaje").css("display", "block"); Esto nos selecciona la capa con id "mensaje" y con el mtodo css() indicamos que queremos cambiar el atributo "display" al valor "block" de ese elemento. $("#mensaje").css("display", "none"); Esta otra lnea muy similar, simplemente cambia el "display" a "none" para ocultar el elemento. Esperamos que estos dos ejemplos te hayan servido para ver rpidamente algunas cosas que se pueden hacer con jQuery con muy poco esfuerzo y que funcionan en todos los navegadores.
Manual de jQuery
Manual de jQuery
Con ese script ya hemos incluido todas las funciones de jQuery dentro de nuestra pgina. Slo tienes que prestar atencin a que tanto el archivo .html de esta pgina, como el archivo .js del framework estn en el mismo directorio. Y, como deca, que el archivo que incluimos con la etiqueta SCRIPT sea el .js que nosotros hemos descargado. Adems, como se puede ver, hemos dejado dentro del HEAD una etiqueta SCRIPT de apertura y cierre que est vaca. Todo el cdigo que vamos a explicar a continuacin tendrs que colocarlo en dentro de esa etiqueta.
Manual de jQuery
Manual de jQuery
$("a").click(function(evento){ alert("Has pulsado el enlace...nAhora sers enviado a DesarrolloWeb.com"); }); }); </script> </head> <body> <a href="http://www.desarrolloweb.com">Ir a DesarrolloWeb.com</a> </body> </html>
Manual de jQuery
1.- Crear la pgina con una capa, un enlace y la definicin de una clase CSS
El primer paso sera construir una pgina con todos los elementos que queremos que formen parte de este primer ejemplo: la capa DIV, el enlace y la definicin de la class CSS. Adems, ahora tambin vamos a incluir el script de jQuery, que lo necesitaremos para acceder a las funciones del framework Javascript. <html> <head> <title>Aadir y quitar clases CSS a elementos</title> <script src="jquery-1.3.2.min.js" type="text/javascript"></script> <style type="text/css"> .clasecss{ background-color: #ff8800; font-weight: bold; } </style> </head>
Manual de jQuery
<body> <div id="capa"> Esta capa es independiente y voy a aadir y eliminar clases css sobre ella </div> <br> <br> <a href="http://www.desarrolloweb.com">Aadir y quitar clase en la capa de arriba</a> </body> </html> Perfecto, ahora ya tenemos la infraestructura necesaria para nuestro ejemplo, con todos los integrantes del mismo. Slo nos faltara hacer el siguiente paso, que es aadir los comportamientos dinmicos con jQuery.
2.- Recordar: aadir siempre los scripts jQuery cuando el documento est "ready"
Ahora vamos a empezar a meter el cdigo Javascript, pero quiero comenzar por recordar a los lectores que cualquier funcionalidad que queramos agregar a la pgina por medio de jQuery, debe ser incluida cuando el documento est listo para recibir acciones que modifiquen el DOM de la pgina. Para esto tenemos que incluir siempre el cdigo: $(document).ready(function(){ //aqu meteremos las instrucciones que modifiquen el DOM });
3.- Aadir los eventos mouseover y mouseout para aadir y quitar una clase CSS
En este paso vamos a crear un par de eventos que asociaremos a los enlaces. Este par de eventos sern lanzados cuando el usuario coloque el puntero del ratn sobre el enlace (mouseover) y cuando el usuario retire el ratn del enlace (mouseout). Por ejemplo, para definir un evento mouseover se tiene que llamar al mtodo mouseover() sobre el elemento que queremos asociar el evento. Adems, al mtodo mouseover() se le enva por parmetro una funcin con el cdigo que se quiere ejecutar como respuesta a ese evento. En el caso de aadir una clase tenemos que utilizar el mtodo addClass(), que se tiene que invocar sobre el elemento al que queremos aadirle la clase. A addClass() tenemos que pasarle una cadena con el nombre de la clase CSS que queremos aadir. Para seleccionar el elemento que queremos aadir la clase hacemos $("#idElemento"), es decir, utilizamos la funcin dlar pasndole el identificador del elemento que queremos seleccionar, precedida del carcter "#". Por ejemplo, con $("#capa") estamos seleccionando un elemento de la pgina cuyo id="capa". $("a").mouseover(function(event){ $("#capa").addClass("clasecss"); }); De manera anloga, pero con el mtodo mouseout(), definimos el evento para cuando el usuario saca el puntero del ratn del enlace.
Manual de jQuery
Manual de jQuery
Manual de jQuery
principio del artculo comentaba que bamos a crear un formulario con una casilla de seleccin (campo checkbox) y que al activar ese campo se mostraran otros contenidos en el formulario. Al desactivarlo, se ocultaran esos contenidos del formulario. Para entender bien lo que deseamos hacer, podemos ver el ejercicio en marcha en una pgina aparte. Lo primero que podemos presentar es el formulario con el que vamos a trabajar. <form> Nombre: <input type="text" name="nombre"> <br> <input type="checkbox" name="mayor_edad" value="1" id="mayoria_edad"> Soy mayor de edad <br> <div id="formulariomayores" style="display: none;"> Dato para mayores de edad: <input type="text" name="mayores_edad"> </div> </form> Como se podr ver, es un formulario como otro cualquiera. Slo que tiene una capa con id="formulariomayores", que contiene los elementos del formulario que queremos mostrar u ocultar al marcar o desmarcar el checkbox. Esa capa estar inicialmente oculta, y para ello hemos colocado el atributo style="display: none;". Podemos fijarnos tambin en el checkbox con id="mayoria_edad", que es el que va servir para marcar si se desea o no ver la parte final del formulario. Ahora hay que hacer cosas cuando se haga clic en el checkbox con id="mayoria_edad". Para ello en deberamos crear un cdigo Javascript y jQuery como este: $(document).ready(function(){ $("#mayoria_edad").click(function(){ //lo que se desee hacer al recibir un clic el checkbox }); }); Como ya hemos comentado, estas lneas sirven para especificar eventos. $(document).ready() se hace para lanzar instrucciones cuando el navegador est preparado para recibirlas y $("#mayoria_edad").click() sirve para realizar acciones cuando se ha hecho clic sobre el elemento con id "mayoria_edad", que es el checkbox del formulario. (Lee el artculo Pasos para trabajar con jQuery para ms informacin sobre este punto). Ahora tenemos que ver las instrucciones que debemos ejecutar como respuesta a ese evento. if ($("#mayoria_edad").attr("checked")){ $("#formulariomayores").css("display", "block"); }else{ $("#formulariomayores").css("display", "none"); } Bsicamente lo que hacemos es comprobar el estado del atributo "checked" del elemento "#mayoria_edad". Esto se hace con el mtodo attr() indicando como parmetro el valor del atributo HTML que queremos comprobar. Entonces, si estaba "checked", se tiene que mostrar el elemento y si no estaba marcado el checkbox, habra que ocultarlo. Espero que se haya entendido bien. Ahora dejo aqu el cdigo completo de este ejemplo: <html> <head> <title>Mostrar Ocultar</title> <script src="jquery-1.3.2.min.js" type="text/javascript"></script> <script>
Manual de jQuery
$(document).ready(function(){ $("#mayoria_edad").click(function(evento){ if ($("#mayoria_edad").attr("checked")){ $("#formulariomayores").css("display", "block"); }else{ $("#formulariomayores").css("display", "none"); } }); }); </script> </head> <body> <form> Nombre: <input type="text" name="nombre"> <br> <input type="checkbox" name="mayor_edad" value="1" id="mayoria_edad"> Soy mayor de edad <br> <div id="formulariomayores" style="display: none;"> Dato para mayores de edad: <input type="text" name="mayores_edad"> </div> </form> </body> </html> Finalmente, podemos verlo en marcha en una pgina aparte.
Manual de jQuery
Manual de jQuery
Manual de jQuery
}); }); Como se puede ver, primero tenemos que definir el evento ready del objeto $(document), para hacer cosas cuando el documento est preparado para recibir acciones. Luego se define el evento click sobre cada uno de los dos enlaces. Para ello invoco el mtodo click sobre el enlace, que hemos seleccionado con jQuery a travs del identificador de la etiqueta A. $("#ocultar").click(function(event){ Con esto estoy definiendo el evento clic sobre el elemento con id="ocultar". Nota: leer el artculo anterior Pasos para utilizar jQuery en tu pgina web, en el que hablbamos sobre eventos y otras generalidades de este framework Javascript. Podremos encontrar explicaciones ms detalladas sobre cmo definir eventos Javascript con jQuery. Dentro de la funcin a ejecutar cuando se hace clic, se coloca la llamada a la funcin de los efectos. $("#capaefectos").hide("slow"); Esto hace que nuestra capa, a la que habamos puesto el identificador (atributo id) "capaefectos", se oculte. Pasamos el parmetro "slow" porque queremos que el efecto sea lento. Ahora veamos la funcin de los efectos con otra llamada: $("#capaefectos").show(3000); Esto hace que se muestre el elemento con id "capaefectos", y que el proceso de mostrarse dure 3000 milisegundos. No hay ms complicaciones, as que si habis entendido esto ya sabis hacer efectos simples pero atractivos con jQuery en vuestra pgina web. Ahora podris ver el cdigo completo de este ejemplo creado por DesarrolloWeb.com para demostrar el uso de efectos. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Efectos con jQuery</title> <script src="jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#ocultar").click(function(event){ event.preventDefault(); $("#capaefectos").hide("slow"); }); $("#mostrar").click(function(event){ event.preventDefault(); $("#capaefectos").show(3000); }); }); </script> </head> <body>
Manual de jQuery
<div id="capaefectos" style="background-color: #cc7700; color:fff; padding:10px;"> Esto es una capa que nos servir para hacer efectos! <br> <br> Pongo este texto simplemente de prueba </div> <p> <a href="#" id="ocultar">Ocultar la capa</a> | <a href="#" id="mostrar">Mostrar la capa</a> </p> </body> </html> Por ltimo, pongo el enlace de nuevo al ejemplo en marcha. Como se ha podido comprobar, hacer efectos con jQuery es bastante sencillo. Claro que hay otros detalles importantes y otros tipos de efectos y funcionalidades de personalizacin de los mismos, pero esto nos ha servido para demostrar lo sencillo que es trabajar con este framework Javascript. En siguientes artculos seguiremos explorando casos de uso tpicos de jQuery.
Manual de jQuery
Manual de jQuery
entender fcilmente y esta sintaxis slo valdr si funcionCallback no recibe parmetros, porque no los podemos indicar con el nombre de la funcin. Veamos entonces una forma de hacer este callback que funcione siempre: miFuncion ("parametros de la funcion", function(){ funcionCallback(); }); Con este cdigo, que funcionara igual que el anterior, lo bueno es que s podemos indicar los parmetros que se necesiten para la llamada a funcionCallback().
Manual de jQuery
Manual de jQuery
Con esta simple sentencia estamos realizando una llamada a Ajax con jQuery. Es una simple invocacin al mtodo load() de un elemento de la pgina, en concreto el que habamos puesto con id="destino". Al mtodo load() le pasamos como parmetro la ruta de la pgina que queremos cargar dentro del elemento. El archivo que cargamos con load() en este ejemplo es "contenido-ajax.html" y simplemente le hemos colocado un texto cualquiera. Lo hemos guardado en el mismo directorio que la pgina web donde est el script jQuery. Nota: para que este ejemplo funcione debe colocarse en un servidor web, puesto que la llamada por Ajax se hace por http y el archivo que se carga entonces tiene que recibirse por un servidor web, que lo mande con ese protocolo al navegador. Si pones los archivos en tu disco duro y los ejecutas tal cual, no te funcionar. Puedes utilizar cualquier espacio de hosting que tengas o bien un servidor web que puedas tener instalado en tu ordenador. As de simple! Podemos ver el cdigo completo de este ejemplo: <html> <head> <title>Ajax Simple</title> <script src="jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#enlaceajax").click(function(evento){ evento.preventDefault(); $("#destino").load("contenido-ajax.html"); }); }) </script> </head> <body> <a href="#" id="enlaceajax">Haz clic!</a> <br> <div id="destino"></div> </body> </html> Podemos ver el ejemplo en marcha en una pgina aparte. Cabra comentar que jQuery tiene muchos otros mtodos de realizar conexiones por Ajax, que pueden servir para muchos otros casos de trabajo que podemos encontrarnos. Nosotros hemos escogido el ms sencillo para dar una primera demostracin de las posibilidades.
Manual de jQuery
que podemos utilizar si fuera necesario: Parmetros a pasar a la pgina: la pgina que carguemos con Ajax puede recibir parmetros por la URL, que se especifican con la tpica notacin de propiedades y valores de jQuery. {nombre: "Pepe", edad: 45} Por ejemplo, con ese cdigo estaramos enviando a la pgina los datos nombre y edad, con los valores "pepe" y 45. Esos datos viajaran en la URL, por el mtodo "POST". Nota: Desde jQuery 1.3 tambin se pueden enviar los parmetros a la pgina a cargar con Ajax por medio de una variable de tipo string, en lugar de una notacin de objetos como hemos comentado. Cuando se use un string para especificar los parmetros a enviar en el request http, stos viajan por el mtodo GET. Cuando se utiliza una notacin de objetos como la que hemos visto, los datos viajan por el mtodo POST. Funcin callback: como otros mtodos de jQuery, podemos especificar opcionalmente una funcin a ser ejecutada cuando se termine de ejecutar el mtodo. En este caso, cuando se termine la llamada Ajax, se pueden hacer acciones, como borrar un mensaje tpico de "cargando...". Nota: En un artculo anterior ya comentamos el habitual uso de funciones callback en jQuery. Ahora veamos un cdigo donde hacemos uso de estos dos parmetros: $(document).ready(function(){ $("#enlaceajax").click(function(evento){ evento.preventDefault(); $("#destino").load("recibe-parametros.php", {nombre: "Pepe", edad: 45}, function(){ alert("recibidos los datos por ajax"); }); }); }) En este caso estamos cargando con load() una pgina PHP llamada "recibe-parametros.php". Estamos pasando los parmetros "nombre" y "edad" a una pgina, que podremos recoger por GET. Adems, hemos colocado una funcin callback en la que simplemente hacemos un alert(), que se ejecutar cuando la llamada a Ajax haya terminado. Este sera el cdigo fuente de "recibe-parametros.php": Recibido el siguiente dato: <br> Nombre: <?php echo $_POST["nombre"];?> <br> Edad: <?php echo $_POST["edad"];?> Podemos ver este ejemplo en una pgina aparte. Con esto hemos podido comprobar lo sencillo que es realizar con jQuery una carga de contenidos que se reciben por Ajax. Como deca, existen muchas otras maneras de hacer conexiones Ajax con jQuery, como el ejemplo del artculo siguiente que nos ensea a mostrar un mensaje de carga miestrs esperamos la respuesta Ajax del servidor. Adems, para complementar esta informacin, tambin podis ver el vdeo de Ajax con jQuery.
Manual de jQuery
Manual de jQuery
capa cargando est oculta de momento, gracias al atributo de estilo CSS display:none). 3) la capa "destino", donde mostraremos la respuesta recibida tras la solicitud Ajax.
Manual de jQuery
Eso lo conseguimos con el mtodo css(), alterando la propiedad display, de manera similar a como lo habamos realizado para mostrar la capa cargando. $("#cargando").css("display", "none"); Esto es todo. Realmente no tiene ninguna complicacin especial. Aunque, como deca, estas cosas se podrn hacer de una manera ms elegante cuando aprendamos un poquito ms sobre jQuery. Por si sirve para aclarar las cosas, dejo a continuacin el cdigo completo de la pgina que hace la solicitud con jQuery: <html> <head> <title>Ajax Simple</title> <script src="jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#enlaceajax").click(function(evento){ evento.preventDefault(); $("#cargando").css("display", "inline"); $("#destino").load("pagina-lenta.php", function(){ $("#cargando").css("display", "none"); }); }); }) </script> </head> <body> Esto es un Ajax con un mensaje de cargando... <br> <br> <a href="#" id="enlaceajax">Haz clic!</a> <div id="cargando" style="display:none; color: green;">Cargando...</div> <br> <div id="destino"></div> </body> </html>
Manual de jQuery
?> En realidad no tiene nada en especial. Simplemente hacemos un sleep(3) para ordenarle a PHP que espere 3 segundos antes de terminar de procesar la pgina y enviarla al cliente. As consigo que la solicitud http tarde un poco es ser respondida y podamos ver el mensaje de carga durante un poco ms de tiempo en la pgina. Finalmente, pongo de nuevo el enlace para ver este ejercicio en marcha. Si te ha interesado este ejemplo y quieres obtener una ayuda adicional para crear tus propios scripts en Ajax, te recomendamos ver el vdeo donde explcamos a hacer Ajax con jQuery.
Manual de jQuery
Core de jQuery
El core de jQuery es la base sobre la que se trabaja para hacer cualquier cosa con jQuery. Contiene una serie de clases y mtodos tiles para hacer tareas reiterativas, que vamos a necesitar en las aplicaciones. Integra desde funciones que sern tiles en cualquier script, por sencillo que sea, hasta funciones menos recurridas pero que nos facilitarn la vida a hora de hacer cdigo limpio, corto y reutilizable. Utilizaremos el Core para realizar cosas tiles con objetos, clases, datos, etc, pero realmente lo que ms haremos ser utilizar la funcin jQuery, que es el pilar fundamental sobre el que se basarn las aplicaciones. Core tiene las funciones clasificadas en diversos apartados: $() (La funcion jQuery): Es la funcin principal de jQuery, que adems tiene diversas utilidades segn los parmetros que se le enven. Su utilidad principal es obtener elementos de la pgina. Accesorios de objetos: Es una gama de funciones de diversa y variada utilidad, que sirven de utilidad para hacer cosas con objetos, tales como iterar con cada uno de sus elementos, saber su tamao, longitud, el selector o contexto con el que se obtuvo, obtener todos sus elementos DOM que contenga, etc. Trabajo con datos: Unas funciones tiles para trabajar con datos y asociarlos a elementos, una forma de guardar informacin adicional a elementos de la pgina. Tambin tiene diversas funciones para trabajar con colas y administrar la salida y entrada de sus elementos.
Manual de jQuery
Plugins: Funciones que permiten extender los elementos jQuery para incorporar nuevos mtodos, algo que se utiliza habitualmente a la hora de crear plugins para aadir funcionalidades a jQuery. Interoperabilidad: Funciones que permiten que jQuery no tenga problemas de compatibilidad con otras libreras Javascript que tambin suelen utilizar la funcin dlar $().
Manual de jQuery
Manual de jQuery
Luego, podramos hacer cualquier cosa con ese elemento seleccionado, como lo siguiente: elem1.css("background-color", "#ff9999"); Este mtodo css() no forma parte del core, pero sirve para cambiar atributos CSS de un elemento, entre otras cosas. As pues, con esa lnea cambiaramos el color de fondo del elemento seleccionado anteriormente, que habamos guardado en la variable elem1. Ahora veamos otro ejemplo de la seleccin de elementos con la funcin dlar. var divs = $("div"); divs.css("font-size", "32pt"); Aqu seleccionamos todas las etiquetas DIV de la pgina, y les colocamos un tamao de letra de 32pt. Podemos ver en una pgina aparte este pequeo script en uso. El cdigo de esta pgina es el siguiente: <html> <head> <title>funcin jquery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ var elem1 = $("#elem1"); //podramos haber escrito: var elem1 = jQuery("#elem1"); elem1.css("background-color", "#ff9999"); var divs = $("div"); //podramos haber escrito: var elem1 = jQuery("#elem1"); divs.css("font-size", "32pt"); }); </script> </head> <body> <div id="elem1">Este elemento se llama elem1</div> <div id="elem2">Este otro elemento se llama elem2</div> </body> </html> Si queremos, podemos utilizar el segundo parmetro opcional, que es el contexto. Con l podramos conseguir seleccionar elementos que pertenecen a una zona concreta de nuestro documento. Por defecto el contexto es la pgina entera, pero lo podemos restringir de esta manera: var inputs = $("input",document.forms[0]); inputs.css("color", "red"); Con la primera lnea conseguimos seleccionar todos los elementos INPUT que pertenecen al primer formulario de la pgina. Se devolver un objeto jQuery que contiene todos los input seleccionados. Con la segunda lnea, invocando el mtodo css() sobre el objeto jQuery recibido, estaramos cambiando el color del texto de esos elementos. Esto no seleccionara los
Manual de jQuery
INPUT de otros formularios, como se puede ver en esta pgina de ejemplo. Ahora por completar un poco ms estas notas, veamos otro ejemplo en el que seleccionamos todos los prrafos (etiqueta P), pero restringimos el contexto nicamente los que estn en un DIV con id="div1". var parrafos_div1 = $("p","#div1"); parrafos_div1.hide() En la segunda lnea lanzamos el mtodo hide() sobre el objeto jQuery que contiene los prrafos seleccionados, con lo que conseguimos que se oculten. Podemos ver una pgina que con este ejemplo en marcha. Contamos con un video que nos habla de la funcion $ en jQuery. En el siguiente artculo veremos otros usos de la funcin jQuery() / funcin dlar $().
Manual de jQuery
Manual de jQuery
Manual de jQuery
Incluso podemos hacer varios callback, para agregar distintas acciones a realizar cuando el DOM est listo, las veces que queramos, igual que cuando definamos el evento ready() sobre el objeto document. Podemos ver el cdigo de una pgina que hace uso de la funcin dlar, pasando por parmetro una funcin. <html> <head> <title>funcin jquery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(function (){ var documento = $("p"); documento.css("background-color", "#ff8833"); }); $(function (){ var documento = $("b"); documento.css("color", "#fff"); }); //si colocase aqu este cdigo, no funcionara, porque el DOM no estara listo para realizar acciones //var documento = $("p"); //documento.css("background-color", "#ff8833"); </script> </head> <body> <p><b>Prrafo</b>!!</p> <p>Otro <b>prrafo</b></p> </body> </html> Se puede ver en marcha en una pgina aparte. Hasta aqu hemos visto todas las posibilidades que existen para trabajar con la funcin jQuery. Realmente a lo largo de este manual ya la habamos utilizado muchas veces y en lo sucesivocontinuaremos usndola, ya que cualquier cosa que deseemos hacer en una pgina web va a depender en algn momento de invocar a $() en alguna de sus variantes.
Manual de jQuery
Manual de jQuery
Con $("p") tengo todos los prrafos. Ahora con each puedo recorrerlos uno a uno. Para cada uno ejecutaremos la funcin que enviamos como parmetro a each(). En esa funcin recibo como parmetro una variable "i" que contiene el ndice actual sobre el que estoy iterando. Con if(i%2==0) estoy viendo si el entero del ndice "i" es par o impar. Siendo par coloco un color de fondo al elemento y siendo impar coloco otro color de fondo. Como se puede ver, con la variable "this" tenemos acceso al elemento actual. Pero OJO, que este elemento no es un objeto jQuery, as que no podramos enviarle mtodos del framework jQuery hasta que no lo expandamos con la funcin jQuery. As pues, tenemos que hacer $(this) para poder invocar al mtodo css(). Por si no queda claro este punto mirar las diferencias entre estas dos lneas de cdigo: this.css("background-color", "#ccc"); $(this).css("background-color", "#ccc"); En la primera lnea no estaramos extendiendo la variable this con las funcionalidades de jQuery, luego no funcionara. En la segunda lnea, que es la que habamos utilizado en el script de ejemplo, s estamos extendiendo la variable "this" con la funcin jQuery. De ese modo, se puede invocar a cualquier mtodo de jQuery sobre los elementos. Podemos ver un ejemplo en marcha que hace uso de ese script. Este sera su cdigo fuente completo: <html> <head> <title>each del core de jQuery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("p").each(function(i){ if(i%2==0){ $(this).css("background-color", "#eee"); }else{ $(this).css("background-color", "#ccc"); } }); }); </script> </head> <body> <p>Primer prrafo</p> <p>Otro prrafo</p> <p>Tecer prrafo</p> <p>Uno ms</p> <p>y acabo...</p> </body> </html>
Manual de jQuery
Manual de jQuery
Manual de jQuery
Podemos ver el cdigo completo de una pgina que hace uso de este mtodo: <html> <head> <title>propiedad length del core jQuery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ //selecciono todos los elementos de la clase "mitexto" var ElementosMitexto = $(".mitexto"); //muestro el nmero de los prrafos encontrados alert ("Hay " + ElementosMitexto.length + " elementos de la clase mitexto"); }); </script> </head> <body> <p>Esto es un prrafo normal</p> <p class="mitexto">Esto es un prrado de la clase "mitexto"</p> <div>Un div normal</div> <div class="mitexto">Ahora un div de la clase "mitexto"</div> </body> </html> Para acabar, dejamos el enlace a una pgina donde se puede ver el ejemplo de la propiedad length del objeto jQuery en funcionamiento.
Manual de jQuery
Mtodo data()
Este mtodo del objeto jQuery sirve tanto para guardar un dato en un elemento como para consultarlo. Segn el nmero de parmetros que reciba, realiza una u otra accin. Si recibe un parmetro data(nombre): devuelve el valor que haya en el dato cuyo nombre se pasa por parmetro. Si recibe dos parmetros data(nombre, valor): almacena un dato, cuyo nombre recibe en el primer parmetro, con el valor que recibe en el segundo parmetro. Como data() es un mtodo que pertenece al objeto jQuery, podemos almacenar estos pares (dato, valor) en cualquiera de los elementos que seleccionemos con la funcin jQuery(). Veamos un caso de uso simple. Por ejemplo tenemos un elemento de la pgina como este: <div id="capa"> En esta divisin (elemento id="capa") voy a guardar y leer datos sobre este elemento. </div> Ahora podramos usar le mtodo data() de la siguiente manera: $("#capa").data("midato","mivalor"); Con esta lnea hemos guardado un dato llamado "midato" con el valor "mivalor", en el elemento con identificador (atributo id) "capa". Ahora podramos leer ese dato en cualquier momento para acceder a su valor, de la siguiente manera: alert($("#capa").data("midato")); En esta lnea de cdigo extraemos el dato "midato" del elemento con identificador "capa" y lo mostramos en una caja de alerta. Podemos ver una pgina en marcha que hace uso de esas dos funciones.
Mtodo removeData()
Este mtodo sirve para eliminar un dato de un elemento y su funcionamiento es tan simple como enviar por parmetro el dato que se quiere eliminar del elemento. $("#capa").removeData("midato") Con esta lnea habramos eliminado el dato llamado "midato" del elemento con identificador "capa".
Manual de jQuery
Manual de jQuery
botn: $("#leer").click(function(evento){ valor = $("#division").data("midato"); $("#division").html('En este elemento (id="division") leo un dato llamado "midato" con el valor "' + valor + '"'); }); Como se puede ver, se recupera el valor del dato "midato" guardado sobre el elemento "#division" (etiqueta HTML con id="division"), y se almacena en una variable. Luego se crea un mensaje para mostrar el valor del dato. Para acabar, tenemos el cdigo del evento click sobre el botn de eliminar el contenido de un dato, que hace uso de removeData(). $("#eliminar").click(function(evento){ $("#division").removeData("midato"); $("#division").html('Acabo de eliminar del elemento (id="division") el dato llamado "midato"'); }); Como se ver, el mtodo removeData() se invoca sobre el elemento que tiene el dato que pretendemos eliminar. Ms tarde se muestra un mensaje informando sobre la accin que se ha realizado. Para comprobar el funcionamiento de estos mtodos habra que crear un dato, escribiendo el valor en el campo de texto y pulsando el botn "guardar dato". Luego podramos leer ese dato con el botn "leer dato". Por ltimo podramos eliminar el dato con el botn "eliminar dato". Si, una vez eliminado pulsamos sobre el botn de "leer dato" veremos que el valor del dato aparece como "undefined", puesto que ese dato ha sido borrado (esto tambin ocurre si no se ha guardado ningn dato todava, por ejemplo cuando se acaba de cargar la pgina). Sera interesante ver el cdigo fuente completo de esta pgina, para hacernos una idea ms exacta de cmo se integraran todos estos elementos. <html> <head> <title>Ejemplos de uso de la funcin data del core de jQuery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#guardar").click(function(evento){ var valor = document.formul.valor.value; //Esta misma lnea de cdigo se puede codificar as tambin con jQuery //var valor = $("#valor").attr("value"); $("#division").data("midato",valor); $("#division").html('He guardado en este elemento (id="division") un dato llamado "midato" con el valor "' + valor + '"'); }); $("#leer").click(function(evento){ valor = $("#division").data("midato"); $("#division").html('En este elemento (id="division") leo un dato llamado "midato" con el valor "' + valor + '"'); }); $("#eliminar").click(function(evento){ $("#division").removeData("midato"); $("#division").html('Acabo de eliminar del elemento (id="division") el dato llamado "midato"');
Manual de jQuery
}); }); </script> </head> <body> <div id="division"> En esta divisin (elemento id="division") voy a guardar datos con la funcin data y luego los voy a leer </div> <br> <form name="formul"> Escribe un valor a guardar, leer o eliminar: <input type="text" name="valor" id="valor"> <br> <input type="button" value="guardar dato" id="guardar"> <input type="button" value="leer dato" id="leer"> <input type="button" value="eliminar dato" id="eliminar"> </form> </body> </html> De nuevo, dejamos el enlace al ejemplo en marcha. Para seguir os indicamos la lectura del siguiente artculo de este manual, donde puedes obtener explicaciones adicionales y ejemplos de uso de estos mtodos data() y removeData().
Manual de jQuery
Manual de jQuery
Mensaje... </div> <br> <button id="guardar">guardar "midato" con valor "mivalor" en todos los enlaces</button> <br> <button id="guardarenlace1">guardar "midato" con valor "otro valor" en el enlace 1</button> Ahora veamos cmo aplicar eventos a los elementos de la pgina, para almacenar datos y mostrarlos. Comencemos por el cdigo de los eventos de los botones. $("#guardar").click(function(evento){ $("a").data("midato","mivalor"); $("#mensaje").html('He guardado en todos los enlaces un dato llamado "midato" con el valor "mivalor"'); }); Con este cdigo estamos almacenando datos en todos los enlaces. Cabe fijarse que con la funcin jQuery $("a") obtenemos un objeto jQuery donde estn todos los enlaces de la pgina. Luego, al invocar data() sobre ese objeto, estamos almacenado ese dato en todos los enlaces existentes. $("#guardarenlace1").click(function(evento){ $("#enlace1").data("midato","otro valor"); $("#mensaje").html('He guardado en el enlace1 un dato llamado "midato" con el valor "otro valor"'); }); En este otro cdigo del evento click para el segundo botn, almacenamos "otro valor" sobre el dato de antes, pero slo lo hacemos sobre el enlace 1, dado que hemos utilizado el selector $("#enlace1"), con el identificador nico del primer enlace. Y ahora podramos ver el cdigo para asignar un evento a todos los enlaces, para que al pulsarlos nos muestre lo que haya en el dato almacenado con data(), si es que hay algo. $("a").click(function(evento){ evento.preventDefault(); valorAlmacenado = $(this).data("midato"); $("#mensaje").html("En el enlace <b>" + $(this).attr("id") + "</b> tiene el dato 'midato' como " + valorAlmacenado); }); Como se puede ver, estamos creando un evento click, pero lo estamos haciendo sobre los tres enlaces que hay en la pgina a la vez, dado el selector utilizado en la funcin jQuery $("a"). Luego el cdigo del evento ser el mismo para los tres enlaces. Lo primero que se hace es un evento.preventDefault() que permite que el enlace no tenga el comportamiento tpico (ir a la URL del href). A continuacin hacemos: valorAlmacenado = $(this).data("midato"); Como se puede ver, se est extrayendo el valor almacenado en el enlace actual, que recibe el evento. Con $(this) obtenemos el objeto jQuery del elemento que ha recibido el evento, que es el enlace sobre el que se ha pulsado y no todos los enlaces. Con el mtodo data("midato"), invocado sobre $(this), obtenemos el valor del dato "midato" almacenado en el enlace que fue
Manual de jQuery
pulsado solamente. Luego se muestra un mensaje para indicar el valor que haba en el dato. Pero claro, este cdigo, como es comn para todos los enlaces, tiene que acceder tambin a $(this) para saber qu enlace en concreto fue el que se puls. Para identificar el enlace se hace $(this).attr("id"), que devuelve el atributo "id" del enlace sobre el que se hizo clic. A continuacin se puede ver el cdigo completo de esta pgina. <html> <head> <title>Ejemplos de uso de la funcin data del core de jQuery</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("a").click(function(evento){ evento.preventDefault(); valorAlmacenado = $(this).data("midato"); $("#mensaje").html("En el enlace <b>" + $(this).attr("id") + "</b> tiene el dato 'midato' como " + valorAlmacenado); }); $("#guardar").click(function(evento){ $("a").data("midato","mivalor"); $("#mensaje").html('He guardado en todos los enlaces un dato llamado "midato" con el valor "mivalor"'); }); $("#guardarenlace1").click(function(evento){ $("#enlace1").data("midato","otro valor"); $("#mensaje").html('He guardado en el enlace1 un dato llamado "midato" con el valor "otro valor"'); }); }); </script> </head> <body> <a href="#" id="enlace1">Enlace 1</a> <br> <a href="#" id="enlace2">Enlace 2</a> <br> <a href="#" id="enlace3">Enlace 3</a> <br> <br>
Manual de jQuery
<div id="mensaje"> Mensaje... </div> <br> <button id="guardar">guardar "midato" con valor "mivalor" en todos los enlaces</button> <br> <button id="guardarenlace1">guardar "midato" con valor "otro valor" en el enlace 1</button> </body> </html> Si se desea, se puede ver el ejemplo en marcha en una pgina aparte. ht
Manual de jQuery
$("#guardar").click(function(evento){ evento.preventDefault(); $("a").data("midato","mivalor"); $("#mensaje").html('He guardado en todos los enlaces un dato llamado "midato" con el valor "mivalor"'); }); $("#guardarenlace1").click(function(evento){ evento.preventDefault(); $("#enlace1").data("midato","otro valor"); $("#mensaje").html('He guardado en el enlace1 un dato llamado "midato" con el valor "otro valor"'); }); $("#guardarobjeto").click(function(evento){ evento.preventDefault(); $("a").data("miobjeto",$("#capapruebas")); $("#mensaje").html('He guardado todos los enlaces un dato llamado "miobjeto" con el valor un objeto que es el objeto jquery de seleccionar la capa con id "capapruebas"'); }); $("#operarobjetoenlace1").click(function(evento){ evento.preventDefault(); $("#enlace1").data("miobjeto").html("cambio el html del objeto que hay en el dato 'miobjeto' del 'enlace1'"); }); $("#operarobjetoenlace2").click(function(evento){ evento.preventDefault(); $("#mensaje").html("Este es el HTML que hay en el objeto asociado a enlace2 en el dato 'miobjeto':<br>" + $("#enlace2").data("miobjeto").html()); }); }); </script> </head> <body> <a href="#" id="enlace1" class="enlacealmacenar">Enlace 1</a> <br> <a href="#" id="enlace2" class="enlacealmacenar">Enlace 2</a> <br> <a href="#" id="enlace3" class="enlacealmacenar">Enlace 3</a>
Manual de jQuery
<br> <br> <div id="mensaje"> Mensaje... </div> <br> <ol style="line-height: 200%;"> <li> <a id="guardar" href="#">guardar "midato" con valor "mivalor" en todos los enlaces</a> </li> <li> <a id="guardarenlace1" href="#">guardar "midato" con valor "otro valor" en el enlace 1</a> </li> <li> <a id="guardarobjeto" href="#">guardar "miobjeto" con una referencia a la capa de pruebas</a> </li> <li style="line-height: 100%;"> <a id="operarobjetoenlace1" href="#">Recuperar un objeto del enlace1 para hacer cosas con l <SPAN style="font-size: 8pt; font-weight: bold"> PULSAR ESTE ENLACE SLO DESPUS DE HABER ALMACENADO EL OBJETO EN LOS ENLACES POR MEDIO DEL ENLACE DE ESTA LISTA MARCADO COMO 3) </SPAN> </a></li> <li style="line-height: 100%;"> <a id="operarobjetoenlace2" href="#">Recuperar un objeto del enlace2 para hacer cosas con l <SPAN style="font-size: 8pt; font-weight: bold"> PULSAR ESTE ENLACE SLO DESPUS DE HABER ALMACENADO EL OBJETO EN LOS ENLACES POR MEDIO DEL ENLACE DE ESTA LISTA MARCADO COMO 3) </SPAN> </a></li> </ol> <br> <br> <div id="capapruebas"> Este es el texto de una capa de pruebas... con id="capapruebas" </div> </body> </html> Hemos visto diversos ejemplos de uso de data() y removeData(), mtodos bsicos de jQuery. Puede que ahora no se les encuentre mucha utilidad, pero nos servirn para resolver problemas futuros y entender cmo funcionan diversos plugins o componentes ms avanzados
Manual de jQuery
de jQuery. Por lo que respecta al Core de jQuery, ya hemos visto diversas funcionalidades en desarrolloweb.com en artculos de este manual. Por ahora lo vamos a dejar por aqu, aunque hay diversos mtodos del Core que no hemos llegado a ver. En los prximos artculos pasaremos pgina y comenzaremos a ver otros temas interesantes que nos permitirn explotar un poco ms nuestra creatividad, poniendo en marcha utilidades ms cercanas a lo que pueden ser nuestras necesidades del da a da.
Manual de jQuery
Selector por identificador: Sirven para seleccionar los elementos que tengan un identificador dado, que se asigna a las etiquetas a travs del atributo id del HTML. Para utilizar este selector se indica primero el carcter "#" y luego el identificador de cuyo elemento se desee seleccionar. $("#idelemento") //selecciona una etiqueta que tiene el atributo id="idelemento" Selector por clase: Podemos indicar el nombre de una clase (class de CSS) y seleccionar todos los elementos a los que se ha aplicado esta clase. Para ello, como en CSS, comenzamos colocando el carcter "." y luego el nombre de la clase que deseamos seleccionar. $(".miclase") //selecciona todos los elementos que tienen el atributo class="miclase" Selector por varias clases: Si lo deseamos, podemos indicar varias clases CSS, para obtener todos los elementos que tienen esas clases aplicadas: todas al mismo tiempo. Esto se consigue comenzando por un ".", igual que los selectores de clases, y luego otro "." para separar las distintas clases que queremos utilizar en el selector. $(".clase1.clase2") //selecciona los elementos que tienen class="clase1 clase2" Selector asterisco "*": Nos sirve para seleccionar todos los elementos de la pgina. $("*") //selecciona todos los elementos que tiene la pgina Concatenar varios selectores distintos: Por ltimo, podemos utilizar varios selectores, para obtener todas las etiquetas que cumplen uno de ellos. No hace falta que cumplan todos los selectores a la vez, sino con que uno de ellos concuerde es suficiente. Para ello colocamos todos los selectores que deseamos, separados por una coma ",". $("div,p") //selecciona todos los elementos divisin y prrafo $(".clase1,.clase2") //selecciona los elementos que tienen la clase "clase1" o "clase2" $("#miid,.miclase,ul) //selecciona el elemento con id="miid", los elementos con class="miclase" y todas las listas UL
Manual de jQuery
Manual de jQuery
}); } }); }); Con document.ready() indicamos una funcin a invocar cuando la pgina est lista para recibir acciones de programacin que modifiquen su estructura. Con $("#boton").click() indicamos una funcin a ejecutar cuando se hace clic sobre el botn. var selectorEscrito = $("#camposelector").attr("value"); Nos sirve para acceder al atributo value del campo de texto, es decir, a lo que haya escrito dentro. Si no hay nada escrito en el campo, muestro un mensaje de alerta, porque en este caso el selector cadena vaca no sera valido y recibiramos un mensaje de error. Si haba algo en el campo, pues selecciono con jQuery los elementos de la pgina que corresponden con el selector escrito en el campo de texto. Eso se hace con la lnea: elementosSeleccionados = $(selectorEscrito); Luego, sobre el elemento o elementos seleccionados, invoco el mtodo fadeOut(), que sirve para ocultar elementos de la pgina. A fadeOut() le paso dos parmetros, uno es la velocidad con la que tiene que hacer el efecto y otro es una funcin callback, a ejecutar slo en el momento que el efecto haya concluido. Eso es con la lnea: elementosSeleccionados.fadeOut("slow", function(){ Por ltimo, en la funcin callback realizamos una llamada al mtodo fadeIn() sobre el mismo objeto jQuery resultado de aplicar el selector anterior, que sirve para que los elementos ocultados se muestren de nuevo en la pgina. Esto ltimo con la lnea: elementosSeleccionados.fadeIn("slow"); En resumen, ocultando y mostrando luego los elementos de vuelta conseguimos ese parpadeo. Si nos resulta extrao este cdigo, recordamos que en el Manual de jQuery de desarrolloweb.com ya hemos publicado varios artculos que aclaran los puntos tratados en este ejemplo, como los efectos rpidos o las funciones callback.
Manual de jQuery
} .fondogris{ background-color: #cccccc; } body{ font-family: verdana, arial, helvetica; } div{ margin-bottom: 4px; } </style> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#boton").click(function(evento){ var selectorEscrito = $("#camposelector").attr("value"); if (selectorEscrito==""){ alert("Escribe algo en el campo de texto") }else{ elementosSeleccionados = $(selectorEscrito); elementosSeleccionados.fadeOut("slow", function(){ elementosSeleccionados.fadeIn("slow"); }); } }); }); </script> </head> <body> <h1>Selectores en jQuery</h1> <p>En esta pgina hay varias etiquetas. Ahora con este formulario puedes escribir un selector, para seleccionar algunas con jQuery, y luego pulsar el botn para ver qu elementos de la pgina has seleccionado.</p> <form> Selector: <input type="Text" name="camposelector" id="camposelector"> <input type="button" id="boton" value="Ver qu elementos seleccionas"> </form> <p id="p1" class="rojo">Este es un prrafo con id="p1" y class="rojo"</p> <p id="p2" class="verde">Este es un prrafo con id="p2" y class="verde" y aqu <i>meto una itlica</i></p>
Manual de jQuery
<p id="p3" class="rojo fondogris">Este es un prrafo con id="p3" y class="rojo fondogris" (es decir, este elemento tiene aplicadas las clases "rojo" y "fondogris"</p> <p id="p4">Este es un prrafo con id="p4", sin class</p> <p>Este es un prrafo sin id ni class</p> <div id="div1">Esto es una divisin con id="div1"</div> <div id="div2" class="rojo">Esto es una divisin con id="div2" y class="rojo" y aqui <b>meto una negrita</b></div> <div id="div3" class="verde fondogris">Esto es una divisin con id="div3" y class="verde fondogris"</div> <div>Esto es una divisin sin id ni class</div> <div class="azul">Esto es una divisin sin id, con class="azul"</div> <b>Esto es una etiqueta b</b> <i>Esto es una etiqueta i</i> </body> </html> Dejamos de nuevo el enlace para ver este ejemplo en marcha y practicar con los selectores de jQuery.
Manual de jQuery
Manual de jQuery
Pero en el caso de la itlica (etiqueta I), que est metida dentro del prrafo, pero dentro tambin de un span, $("p i") seleccionara la etiqueta I por ser descendiente de P, pero $("p > i") no seleccionara la etiqueta I, por no ser hija directa de P. Selector prev + next: Con este selector conseguimos acceder a las elementos que estn despus de otros, es decir, a las etiquetas que concuerdan con el selector "next", que se abren despus de cerrar las etiquetas que concuerdan con el selector "prev". $("p.parraforojo + p") //Esto selecciona los prrafos que estn despus de cualquier prrafo que tenga la clase "parraforojo" $("i + b") //selecciona todas las negritas (etiqueta B) que hay despus de una itlica (etiqueta I) Selector prev ~ siblings: Selecciona los elementos hermanos que hay a continuacin de los elementos que concuerden con el selector "prev", que son del tipo que se especifica con el selector "siblings". Los elementos hermanos son los que estn en el mismo contenedor y se encuentran en el mismo nivel de jerarqua. $("#miparrafo ~ table") //selecciona los elementos TABLE que son hermanos del elemento con id="miparrafo" $("#a2 ~ div.clase") //selecciona los elementos hermanos del que tiene el id="a2" que sean etiquetas DIV con la class="clase".
Manual de jQuery
$("#a2 ~ div.clase").css("font-size", "180%"); $("#miparrafo ~ table").css("border", "3px dotted #dd6600"); }); </script> </head> <body> <p class="parraforojo"> <i>Hola</i> <b>esto</b> es un <b>prrafo</b> rojo <i>donde</i> he <b>puesto</b> unas <b>negritas</b> </p> <p class="parraforojo">Otro <b>con</b> clase class="parraforojo" <span class="unspan"><b>(esto est dentro de unspan B, no depende directamente -no child- del prrafo)</b></span></p> <p>Hola <b>esto</b> es otro <b>prrafo </b>para <i>poner</i> otras <b>negritas</b></p> <p>hola!!!</p> <table border=1> <tr> <td><i>Tabla cualquiera</i></td> <td>Esta tabla <b>no tiene</b> class de <b>CSS</b></td> </tr> </table> <p id="miparrafo">Este es el prrafo con id="miparrafo"</p> <table class="mitabla" border=1> <tr> <td colspan=2>Esta tabla tiene una <b>clase CSS</b></td> </tr> <tr> <td><i>class="mitabla"</i></td> <td class="mitd">Y este <b>td</b> le he puesto <i>class="mitd"</i> <span>Una cosa<span>otra cosa</span></span></td> </tr> </table> <p><b>Prrafo</b> que tiene alguna <b>negrita</b> e <span class="algo"><i>itlica</i></ span> para seleccionar</p> <div> <div id="a1">hola</div> <div id="a2">dos</div> <div id="a3">3</div> <span>Cuatro (no es un div)???</span> <div id="a4" class="clase">Cuatro de verdad</div> </div> <ul> <li>Elem 1</li>
Manual de jQuery
<li class="elemlista">Elem 2</li> <li>Elem 3</li> <li>Elem 4</li> <li class="elemlista">Elem 5</li> <li class="elemlista">Elem 6</li> <li>Elem 7</li> </ul> </body> </html> Podemos ver el ejemplo en marcha en una pgina aparte.
Manual de jQuery
Lectura de un atributo
El primer uso de attr() es para recuperar el valor de un atributo. En este caso, el mtodo debe recibir una cadena con el nombre del atributo que queremos recuperar. <="" span=""> Ahora podramos acceder a lo que hay escrito en el campo de texto de la siguiente manera: $("#campotexto").attr("value") Pero atencin, en el caso que invoquemos el mtodo attr sobre un objeto jQuery que contenga varios elementos a la vez, attr() en este caso devolvera el valor del atributo del primero de los elementos que haya en el objeto jQuery. Adems, en caso que el elemento no tenga definido ese atributo al que se pretenda acceder, devolvera undefined. Veamos un ejemplo, tambin simple, pero un poco ms elaborado. Tenemos varios enlaces en la pgina, con este cdigo HTML: <a href="http://www.elpais.com" title="Diario El Pas">El Pas</a> <br> <a href="http://www.mozilla.org" title="Fundacin Mozilla">Mozilla Fundation</a> <br> <a href="http://es.openoffice.org/" title="Siute de programas de oficina">Open Office</a> Si hacemos algo como esto: $("a").attr("title") Obtendremos el valor del atributo title del primero de los enlaces. Como tenemos tres enlaces en la pgina, $("a") nos devolvera un objeto jQuery que contiene esos tres enlaces, pues recordar, que attr("title") devuelve el valor del atributo "title" del primero de los elementos del objeto jQuery. Ahora bien, si quisiramos obtener el valor del atributo "title" de todos los elementos, tendramos que hacer un recorrido a cada uno de los enlaces con el mtodo each del core de jQuery http://www.desarrolloweb.com/articulos/core-each-jquery.html. Veamos un ejemplo de una pgina completa que hace ese recorrido con each para recuperar
Manual de jQuery
todos los valores de los atributos title de los enlaces que haya en la pgina: <html> <head> <title>mtodo attr</title> <script src="../jquery-1.3.2.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("a").each(function(i){ var titulo = $(this).attr("title"); alert("Atributo title del enlace " + i + ": " + titulo); }); }); </script> </head> <body> <a id="enlace1" href="http://www.elpais.com" title="Diario El Pas">El Pas</a> <br> <a href="http://www.mozilla.org" title="Fundacin Mozilla">Mozilla Fundation</a> <br> <a href="http://es.openoffice.org/" title="Siute de programas de oficina">Open Office</a> </body> </html> Podemos ver el ejemplo en marcha en una pgina aparte.
Modificar un atributo
Ahora vamos a ver un uso de attr() en el que no leemos el atributo, sino que lo modificamos. En este caso la funcin recibe dos cadenas de texto, la primera con el nombre del atributo y la segunda con el nuevo valor que queremos asignar. Por ejemplo: $('li').attr("type", "square"); Esto hara que todos los elementos de lista tengan un bullet de tipo cuadrado. Si lo deseas, puedes ver el ejemplo en marcha en una pgina aparte.
Manual de jQuery
para todos los enlaces a la vez. $('a').attr({ 'title': 'Title modificado por jQuery', 'href': 'http://www.desarrolloweb.com', 'style': 'color: #f80' }); A partir de la ejecucin de la sentencia anterior todos los title de los enlaces tendrn el valor "Title modificado por jQuery". Las URLs a las que enlazarn los link sern siempre la home de Desarrollo Web y adems se les crear un estilo CSS para que sean de color naranja. Podemos ver una pgina aparte con este ejemplo en marcha. En el siguiente artculo veremos un ejemplo ms elaborado sobre la modificacin de atributos de elementos a travs de la funcin attr(), en el que para obtener el valor del atributo a modificar utilizamos una funcin que pasamos tambin como parmetro a attr(). Adems, para los interesados en aprender en vdeo puede accederse a las funciones de Attibutes en el Videotutorial de jQuery.
Manual de jQuery
Manual de jQuery
}); </script> </head> <body> <form> <input type="text" class="fecha"> <input type="text" class="nofecha"> <input type="text" class="fecha"> </form> </body> </html> Si se desea, se puede ver en marcha el ejemplo en una pgina aparte.
Manual de jQuery
<body> <table width="50"> <tr> <td nowrap> Esta celda tiene un nowrap, con lo que todo el texto se muestra en la misma lnea! Pero realmente la tabla mide 50 pixeles de anchura, luego tendran que aparece varias lneas! </td> </tr> </table> <input type="Button" id="boton" value="Quitar nowrap"> </body> </html> Un detalle es que en la lnea que se hace la llamada al mtodo removeAttr("noWrap"), el nombre del atributo "noWrap" tiene que estar escrito con la "W" mayscula para que funcione en Explorer. Podemos ver el ejemplo de removeAttr() en marcha en una pgina aparte.
Manual de jQuery
.css( nombre_propiedad_css )
Si enviamos un solo parmetro al mtodo CSS estamos indicando que queremos recibir el valor de una propiedad CSS. En este caso la funcin devolver el valor del atributo CSS que le hayamos indicado. Si tenemos un elemento en la pgina como este, al que le hemos colocado un identificador, atributo id="micapa": <div id="micapa" style="color: red;">hola!</div> Podremos acceder a alguna de sus propiedades css de la siguiente manera: $("#micapa").css("color"); Esto nos devolver el atributo "color" de ese elemento, que en este caso vala "color". Como podemos suponer, el mtodo CSS enviando un solo parmetro puede servir de mucha utilidad para obtener datos sobre los estilos actuales de nuestros elementos, no obstante, todava es ms utilizada la siguiente opcin, en la que enviamos dos parmetros.
Manual de jQuery
una nica llamada a css() se cambien varias propiedades a la vez. $("#micapa").css({ "background-color": "#ff8800", "position": "absolute", "width": "100px", "top": "100px", "left": "200px" }) Como se puede ver, se estaran actualizando con la anterior llamada a css() varios atributos CSS, como el color de fondo, la posicin del elemento, su anchura, etc. Sobre este punto vamos a dar un ejemplo adicional que puede estar bien para aprender a variar un atributo CSS teniendo en cuenta el valor anterior que tuviera. $("#micapa").mouseover(function(){ antiguoLeft = parseInt($(this).css("left")); //alert (antiguoLeft); $(this).css("left", antiguoLeft + 10 + "px"); }) Con esto estamos definiendo un evento onmouseover sobre la capa con id="micapa", por lo que estas instrucciones se pondrn en ejecucin cuando se pase el ratn por encima de la capa. Dentro del mtodo estamos haciendo un par de cosas. Como primer paso estamos extrayendo el valor de la propiedad CSS "left" y convirtindola en un entero. Como segundo paso estamos actualizando ese valor de "left" y asignando un nuevo valor que sera 10 pxeles ms que el valor antiguo. Para ello sumamos 10 al valor antiguo de "left" y lo concatenamos con la unidad de medida "px". Cambiar un nico atributo y colocar el valor segn el resultado de una funcin: Este tercer uso es un poco ms avanzado y est disponible slo a partir de jQuery 1.4. Consiste en enviarle una funcin como segundo parmetro, en vez del valor directamente, para asignar al atributo el valor devuelto por esa funcin. Esto es tan sencillo de poner en marcha como pasar una funcin que simplemente tenga un return. Pero hay un detalle y es que esa funcin recibe dos valores. El primero es el ndice del elemento dentro del objeto jQuery que recibe el mtodo y el segundo, ms til, sirve para obtener el valor actual que hay en el atributo que queremos cambiar. Para ver este uso del mtodo jQuery hemos preparado el siguiente ejemplo. $("#micapa").click(function(){ $(this).css("width", function(index, value){ //alert (value); var aumento = prompt("cuanto quieres aumentar?", "25"); return (parseInt(value) + parseInt(aumento)) + "px"; }); }) Como se puede ver, se define un evento clic sobre una capa. Luego utilizamos el mtodo css() sobre el elemento, para cambiar el atributo width. El valor de width que se colocar ser lo que devuelva la funcin indicada como segundo parmetro en el mtodo css(). Si nos fijamos, la funcin devuelve un valor, que es lo que se colocar en el atributo width.
Manual de jQuery
Manual de jQuery
Manual de jQuery
alert(posicionReal.left);
Manual de jQuery
dimensiones de un par de elementos de la pgina. Adems, tenemos un par de botones para alterar el CSS de los elementos dinmicamente y as volver a ver sus posiciones y dimensiones y comprobar cmo han cambiado. Realmente no sirve de mucho el ejemplo, pero al menos esperamos que resultar bastante didctico. Podemos verlo en marcha en una pgina aparte. Ahora el cdigo de este ejemplo, que no debera resultar muy complicado si hemos seguido el manual de jQuery hasta este punto. <html> <head> <title>Funciones CSS en jQuery</title> <script src="../jquery-1.4.1.min.js"></script> <script type="application/x-javascript"> function dimensionCapa(capa){ capa = $(capa); var dimensiones = ""; dimensiones += "Dimensiones internas: " + capa.innerWidth() + "x" + capa.innerHeight(); dimensiones += "\nDimensiones externas: " + capa.outerWidth() + "x" + capa.outerHeight(); alert(dimensiones); } function posicionCapa(capa){ capa = $(capa); var posicion = ""; posicion += "Posicin relativo al documento:\nLEFT: " + capa.offset().left + "\nTOP:" + capa.offset().top; posicion += "\n\nPosicin si no tuviera margen:\nLEFT: " + capa.position().left + "\nTOP:" + capa.position().top; alert(posicion); } $(document).ready(function(){ $("#botondimensiones").click(function(){ dimensionCapa("#capa1"); }); $("#botonposicion").click(function(){ posicionCapa("#capa1"); }); $("#botontamano").click(function(){ $("#capa1").css("width", 200); }); $("#botonmargen").click(function(){ $("#capa1").css("margin", 20); }); $("#botondimensionesc2").click(function(){ dimensionCapa("#capa2"); });
Manual de jQuery
$("#botonposicionc2").click(function(){ posicionCapa("#capa2"); }); }); </script> </head> <body> <h1>Funciones CSS en jQuery de dimensiones y posicin</h1> <p>Probando funciones de localizacin de elementos en la pgina...</p> <div id="capa1" style="padding: 24px; background-color: #ffccdd; float: left; border: 2px dotted #666;"> <h2>capa1:</h2> Voy a crear esta capa para ver lo que mide y donde est posicionada. </div> <br style="clear: both;"> <div style="margin: 10px;"> <button id="botondimensiones" type="button">Dimensiones de capa1</button> <button id="botonposicion" type="button">Posicion de capa1</button> <button id="botontamano" type="button">Cambiar tamao capa1</button> <button id="botonmargen" type="button">Cambiar margen capa1</button> </div> <div style="margin: 10px;"> <button id="botondimensionesc2" type="button">Dimensiones de capa2</button> <button id="botonposicionc2" type="button">Posicion de capa2</button> </div> <br> Desplaza la pgina hacia abajo para ver la capa2... <br> <br> ... <br> <div id="capa2" style="background-color:#ccc; border-bottom: 5px solid #999; margin-left: 10px;"> Esta capa est muy hacia abajo!! </div> </body> </html> Para acabar, podemos ver este script funcionando en una pgina aparte.
Manual de jQuery
Manual de jQuery
conocimientos. Si lo deseamos, podemos ver el anterior script en marcha en una pgina aparte. En el ejemplo anterior vimos cmo realizar un evento clic, pero claro que no es el nico evento que podemos aplicar a una web. En el prximo artculo veremos un listado de los tipos de evento disponibles en jQuery, pero antes de eso vamos a ver un ejemplo adicional sobre eventos, en el que vamos a incorporar el evento dblclick que aun no habamos visto.
Manual de jQuery
clic realizados y podremos comprobar que siempre se producen dos clics antes de cualquier doble clic. Eso es todo, aunque para completar esta informacin, puedes encontrar a continuacin el cdigo completo de este ejemplo de uso de eventos en jQuery. <html> <head> <title>Trabajando con eventos</title> <script src="../jquery-1.4.1.min.js"></script> <script> var numClics = 0; var numDobleClics = 0; $(document).ready(function(){ $("#micapa").dblclick(function(e){ numDobleClics++; $("#mensaje").html("Doble Clic " + numDobleClics); }); $("#micapa").click(function(e){ numClics++; $("#mensaje").html("Clic " + numClics); }); }) </script> </head> <body> <h1>Trabajando con eventos en jQuery</h1> <div id="micapa" style="padding: 10px; background-color: #ffcc99; width: 150px; float: left;">Hazme dobleclick</div> <div id="mensaje" style="padding: 10px; margin-left: 180px;">Aqu voy a colocar mensajes para que los leas...</div> </body> </html> Quizs quieras ver funcionando de este ejemplo de evento clic y doble-clic. En este artculo slo hemos conocido los manejadores de eventos clic y doble-clic, pero hay muchos ms. En el prximo artculo presentaremos un listado de los tipos de manejadores de eventos disponibles en jQuery.
Manual de jQuery
Manual de jQuery
Sirve para lo mismo que el evento mouseover de Javascript. Se produce cuando el ratn est sobre un elemento, pero tiene como particularidad que puede producirse varias veces mientras se mueve el ratn sobre el elemento, sin necesidad de haber salido. toggle() Sirve para indicar dos o ms funciones para ejecutar cosas cuando el usuario realiza clics, con la particularidad que esas funciones se van alternando a medida que el usuario hace clics.
Manual de jQuery
Manual de jQuery
Este cdigo se puede modificar fcilmente para que se muestre las coordenadas del ratn al hacer clic en la pgina, independientemente de donde se haga clic y no slo en un elemento en concreto. $(document).click(function(e){ alert("X: " + e.pageX + " - Y: " + e.pageY) }); Como se puede ver, se ha indicado el evento "click" sobre el objeto document, que existe en Javascript y que hace referencia a todo el documento que se est visualizando. El cdigo completo de una pgina que define este evento y utiliza las mencionadas propiedades del objeto evento es el siguiente. <html> <head> <title>Trabajando con el objeto evento</title> <script src="../jquery-1.4.1.min.js"></script> <script> $(document).ready(function(){ $(document).click(function(e){ alert("X: " + e.pageX + " - Y: " + e.pageY) }); }) </script> </head> <body> <h1>Trabajando con el objeto evento</h1> Haz clic en cualquier parte de la pgina... </body> </html> Podemos ver el ejemplo en funcionamiento en una pgina aparte. Nota: en los ejemplos anteriores hemos visto cmo calcular la posicin del ratn al hacer clic. Sin embargo, nosotros podemos calcular la posicin del ratn al producirse cualquier evento, ya que el objeto evento de jQuery est disponible para cualquier evento. Por ejemplo, con este cdigo mostramos la posicin del ratn al moverlo por la pgina, mostrando las coordenadas en el texto de los titulares h1 que pueda haber en la pgina: $(document).mousemove(function(e){ $("h1").html("X: " + e.pageX + " - Y: " + e.pageY) }); Si lo deseas, puedes ver el script en marcha aqu. Con las nociones que tenemos en este momento sobre el objeto evento podremos continuar con las explicaciones sobre eventos, en las que utilizaremos varios aspectos de este objeto. As pues, puedes continuar esta lectura aprendiendo acerca de los Eventos de ratn.
Manual de jQuery
Manual de jQuery
padding: 10px; display: none; position: absolute; Los estilos importantes aqu son display: none; (para que el elemento est oculto inicialmente) y position: absolute; (para que lo podamos posicionar libremente por la pgina y sin afectar a otros elementos). Veamos ahora el cdigo del evento mouseenter: $("#elemento1").mouseenter(function(evento){ $("#tip1").css("left", evento.pageX + 5); $("#tip1").css("top", evento.pageY + 5); $("#tip1").css("display", "block"); }); Simplemente cambiamos las propiedades de CSS "left" y "top" de la capa del tip, asignando valores a travs de evento.pageX y evento.pageY, las propiedades del objeto evento que nos dan la posicin del ratn. Con esto situamos la capa del tip en un lugar prximo a donde estaba el ratn. Luego se cambia el atributo de CSS display de la capa del tip, al valor "block", que sirve para que ese elemento se vea en la pgina. Ahora veamos el evento mouseleave, para realizar acciones cuando sacamos el ratn de encima de un elemento. $("#elemento1").mouseleave(function(e){ $("#tip1").css("display", "none"); }); Simplemente cambiamos la propiedad CSS display del tip, para el valor "none", que hace que esa capa desaparezca de la pgina. Veamos el cdigo completo de una pgina que implementa este mecanismo para producir tips en jQuery. <html> <head> <title>Trabajando con eventos - Tip simple</title> <style type="text/css"> .tip{ background-color: #ffcc99; padding: 10px; display: none; position: absolute; } </style> <script src="../jquery-1.4.1.min.js"></script> <script> $(document).ready(function(){ $("#elemento1").mouseenter(function(e){ $("#tip1").css("left", e.pageX + 5); $("#tip1").css("top", e.pageY + 5);
Manual de jQuery
$("#tip1").css("display", "block"); }); $("#elemento1").mouseleave(function(e){ $("#tip1").css("display", "none"); }); $("#elemento2").mouseenter(function(e){ $("#tip2").css("left", e.pageX + 5); $("#tip2").css("top", e.pageY + 5); $("#tip2").css("display", "block"); }); $("#elemento2").mouseleave(function(e){ $("#tip2").css("display", "none"); }); }) </script> </head> <body> <h1>Trabajando con eventos en jQuery</h1> <div id="elemento1" style="background-color: #ccccff; padding: 5px;">Pasa el ratn por encima de este "elemento1".</div> <p> Este texto es para poner <a id="elemento2" href="#">otro elemento con tip</a>. </p> <div class="tip" id="tip1">Esto es para explicar algo sobre el elemento1</div> <div class="tip" id="tip2">Explico mejor este otro elemento con tip!!</div> </body> </html> Ahora podemos ver el ejercicio en marcha. Con esto estamos aprendiendo un poco ms sobre eventos en jQuery. Hemos visto un par de aplicaciones interesantes de eventos de ratn, concretamente mouseenter y mouseleave Pero aun nos quedan bastantes cosas por ver que dejaremos para prximos artculos. Nota: Tenemos un video titulado "Videotutorial: manejo de eventos al detalle en jQuery" que os puede ayudar con esto de los eventos.
Manual de jQuery
Manual de jQuery
evento que se est procesando ("keydown", "keyup", "click" o cualquier otro). La tecla pulsada, que se obtiene con la propiedad which, la trataremos con detalle dentro de poco. Ahora podramos hacer que cualquier evento de teclado invoque esta funcin con el cdigo: $(document).keypress(operaEvento); $(document).keydown(operaEvento); $(document).keyup(operaEvento); Como hemos asociado los eventos al objeto document de Javascript, estos eventos se pondrn en marcha cada vez que se pulse una tecla, independientemente de dnde est el foco de la aplicacin (o donde est escribiendo el usuario). Esto se puede ver en marcha en una pgina aparte. Creo que merece la pena presentar el cdigo completo del anterior ejemplo: <html> <head> <title>Trabajando con eventos de teclado en jQuery</title> <script src="../jquery-1.4.1.min.js"></script> <script> function operaEvento(evento){ $("#loescrito").html($("#loescrito").html() + evento.type + ": " + evento.which + ", ") } $(document).ready(function(){ $(document).keypress(operaEvento); $(document).keydown(operaEvento); $(document).keyup(operaEvento); }) </script> </head> <body> <h1>Eventos de teclado en jQuery</h1> <div id="loescrito"></div> </body> </html>
Manual de jQuery
<br> <div id="loescrito"></div> </form> Ahora definiremos con jQuery el evento keypress, para mostrar la tecla pulsada. $("#mitexto").keypress(function(e){ e.preventDefault(); $("#loescrito").html(e.which + ": " + String.fromCharCode(e.which)); }); Con e.preventDefault(); hacemos que no se escriba nada en el textarea, osea, estamos inhibiendo el comportamiento habitual del evento, que es escribir las teclas en el textarea, que no tiene mucho que ver con nuestro ejemplo, pero que est bien para ver cmo funciona. Luego escribimos en la capa con id "loescrito" el cdigo de Unicode de esa tecla y luego su conversin a un carcter normal, a travs de la funcin esttica de la clase String fromCharCode(). El cdigo completo del ejercicio es el siguiente. <html> <head> <title>Trabajando con eventos de teclado en jQuery</title> <script src="../jquery-1.4.1.min.js"></script> <script> $(document).ready(function(){ $("#mitexto").keypress(function(e){ e.preventDefault(); $("#loescrito").html(e.which + ": " + String.fromCharCode(e.which)) }); }) </script> </head> <body> <h1>Eventos de teclado en jQuery</h1> <h2>Averiguar qu tecla se est pulsando</h2> <form> <textarea cols=300 rows=2 id="mitexto">Escribe algo aqu!</textarea> <br> <b>Tecla pulsada:</b> <br> <div id="loescrito"></div> </form> </body> </html> Podemos ver el ejemplo en marcha en una pgina aparte. Con esto habremos aprendido ya a manejar eventos de teclado, aunque os recomendamos experimentar vosotros mismos con este tipo de eventos modificando el script y ver nuestro
Manual de jQuery
Manual de jQuery
Manual de jQuery
Al hacer clic en cualquier elemento de la clase CSS "miclase", se mostrar un mensaje en una caja de alerta. Ahora podemos ver cmo se creara una funcin que se asignara para varios tipos de eventos a la vez. $("p").bind("click mouseenter mouseleave", function(e){ if ($(this).css("color")!="rgb(250, 100, 0)") $(this).css("color", "rgb(250, 100, 0)"); else $(this).css("color", "rgb(150, 0, 255)"); }) Como se puede ver, se ha definido un evento para todos los prrafos de la pgina, que se activar con los tipos de eventos: "click mouseenter mouseleave". La funcin que hace de manejador de eventos averigua el color del elemento y lo va intercambiando entre dos colores distintos. Este evento se ejecutar al hacer clic, al entrar en el elemento con el puntero del ratn o al salir del elemento con el ratn.
Manual de jQuery
Manual de jQuery
actuales y futuros sobre un selector jQuery, que nos facilitar las cosas en scripts ms complejos.
Manual de jQuery
Manual de jQuery
elem.html("Hiciste de nuevo clic!!"); } }); Es un evento que permite cambiar el texto del elemento cuando se pulsa sobre l y lo aplicamos sobre todos los elementos de la clase "verde". Ahora tenemos un par de botones para hacer cosas con la pgina y cambiarla un poco. <input type=button value="insertar nuevo elemento verde" id="insertarelem"> <input type=button value="Poner la clase verde en el div que no la tiene" id="ponerclaseverde"> Cuando se pulse el primer botn, voy a insertar un nuevo elemento en la pgina al que le pondremos la clase "verde". Eso lo consigo con este cdigo: $("#insertarelem").click(function(e){ var nuevoElemento = $('<div class="verde">Elemento creado e insertado dinamicamente</ div>'); nuevoElemento.appendTo($(document.body)); }); Los elementos que se creen al apretar ese botn tendrn la clase verde y por tanto la funcionalidad especificada con el mtodo live() para definir el evento clic. El segundo botn asigna la clase "verde" al elemento DIV del principio, que no la tena, lo que conseguimos as: $("#ponerclaseverde").click(function(e){ $("#noverde").addClass("verde"); }); Al asignar esa clase al elemento tambin se aplicar la funcionalidad definida para el evento click con live(). Esto lo podemos ver en funcionamiento en una pgina aparte. Para acabar, dejamos el cdigo completo de esta pgina de ejemplo de live() en jQuery. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <title>Eventos live</title> <style type="text/css"> .verde{color: green;} </style> <script src="../jquery-1.4.2.min.js"></script> <script language="javascript"> $(document).ready(function(){ $(".verde").live("click", function(e){ var elem = $(this); if (elem.html()!="Hiciste clic!!"){ elem.html("Hiciste clic!!");
Manual de jQuery
}else{ elem.html("Hiciste de nuevo clic!!"); } }) $("#insertarelem").click(function(e){ var nuevoElemento = $('<div class="verde">Este elemento se ha creado e insertado dinamicamente (haz clic)</div>'); nuevoElemento.appendTo($(document.body)); }); $("#ponerclaseverde").click(function(e){ $("#noverde").addClass("verde"); }); }) </script> </head> <body> <div class="verde">Esta capa tiene la clase verde (haz clic)</div> <div class="verde">Segunda capa donde coloco la clase verde</div> <div id="noverde">Tercera capa que no es verde</div> <div class="verde">Otra con clase verde</div> <input type=button value="insertar nuevo elemento verde" id="insertarelem"> <input type=button value="Poner la clase verde en el div que no la tiene" id="ponerclaseverde"> </body> </html>
Manual de jQuery
ciclo de vida mayor. Para cumplir todos esos objetivos vamos a pasar directamente a explicar los plugins en jQuery, una de las "herramientas" que utilizars habitualmente, si quieres hacer cosas ms avanzadas con el framework y sacarle todo su provecho.
Manual de jQuery
incluidas en el objeto jQuery por medio de plugins. Es decir, en la construccin del framework en muchas de las ocasiones simplemente se crean plugins para extenderlo. As pues, esta tcnica es usada, no slo por terceros desarrolladores, para crear nuevos componentes, sino tambin por el propio equipo de jQuery para el diseo base de este framework. Si lo deseamos, aparte de seguir los prximos artculos de este manual, podemos ver el cdigo fuente del framework o cmo estn hechos los plugins de otros desarrolladores, para tener una idea sobre cmo se utilizan. A modo de ejemplo, podemos ver a continuacin un cdigo fuente de un plugin muy sencillo: jQuery.fn.desaparece = function() { this.each(function(){ elem = $(this); elem.css("display", "none"); }); return this; }; Este plugin permitira hacer desaparecer a los elementos de la pgina y podramos invocarlo por ejemplo de la siguiente manera: $("h1").desaparece(); En el siguiente artculo veremos con mayor detalle la creacin de un plugin de jQuery y explicaremos varios temas que resultarn de vital importancia para entender el cdigo anterior y para construirlos nosotros mismos.
Manual de jQuery
Manual de jQuery
que se puedan aplicar en este plugin tan simple que vamos a ver. El plugin que vamos a construir sirve para hacer que los elementos de la pgina parpadeen, esto es, que desaparezcan y vuelvan a aparecer en un breve instante. Es un ejemplo bien simple, que quizs tenga ya alguna utilidad prctica en tu sitio, para llamar la atencin sobre uno o varios elementos de la pgina. Para hacerlo, utilizaremos otras funciones del framework como fadeOut() (para hacer desaparecer al elemento) y fadeIn() (para que aparezca de nuevo). jQuery.fn.parpadea = function() { this.each(function(){ elem = $(this); elem.fadeOut(250, function(){ $(this).fadeIn(250); }); }); return this; }; Con this.each creamos un bucle para cada elemento que pueda haberse seleccionado para invocar el plugin. Con elem=$(this) conseguimos extender a this con todas las funcionalidades del framework y el objeto jQuery resultante guardarlo en una variable. Luego invocamos fadeOut(), enviando como parmetro un nmero que son los milisegundos que durar el efecto de desaparecer el elemento. Luego enviamos como parmetro una nueva funcin que es un callback, que se ejecutar cuando haya terminado fadeOut() y en esa funcin callback se encargar simplemente de ejecutar un fadeIn() para mostrar de nuevo el elemento. Nota: A lo largo del Manual de jQuery hemos visto varias de las cosas que utilizamos en este ejemplo, como los efectos en jQuery y las funciones Callback. Ahora veamos cmo podramos invocar este plugin: $(document).ready(function(){ //parpadean los elementos de class CSS "parpadear" $(".parpadear").parpadea(); //aado evento clic para un botn. Al pulsar parpadearn los elementos de clase parpadear $("#botonparpadear").click(function(){ $(".parpadear").parpadea(); }) }) Dado el cdigo anterior, al abrir la pgina parpadearn los elementos de la clase "parpadear" y luego habr un botn que repetir la accin de parpadear cuando se pulse. En este caso no hemos colocado el script en un archivo aparte con el nombre jquery.parpadea.js, tal como se recomendaba, pero de momento ser suficiente para probar esto de los plugins y quizs ms fcil porque as no necesitamos ms que un archivo HTML con todo el cdigo junto. Podemos ver el cdigo completo de este ejemplo a continuacin: <html> <head> <title>Creando plugins en jQuery</title>
Manual de jQuery
<script src="../jquery-1.4.1.min.js"></script> <script> jQuery.fn.parpadea = function() { this.each(function(){ elem = $(this); elem.fadeOut(250, function(){ $(this).fadeIn(250); }); }); return this; }; $(document).ready(function(){ //parpadean los elementos de class CSS "parpadear" $(".parpadear").parpadea(); //aado un evento clic para un botn, para que al pulsarlo parpadeen los elementos de clase parpadear $("#botonparpadear").click(function(){ $(".parpadear").parpadea(); }) }) </script> </head> <body> <p class="parpadear">Hola que tal, esto parpade gracias a jQuery!</p> <p>Parafo normal que no va a parpadear.</p> <p class="parpadear">S parpadea</p> <p>Parafo normal que no va a parpadear tampoco...</p> <div class="parpadear" style="background-color: #ff9966; padding: 10px;">Esta capa tambin tiene la clase parpadear, con lo que ya se sabe...</div> <p><input type="button" value="Parpadea de nuevo" id="botonparpadear"></p> </body> </html> Para acabar, puedes acceder al ejercicio en una pgina aparte. Nota: Contamos con un taller de JQuery donde recopilamos un conjunto de plugins y mostramos cmo se construyen.
Manual de jQuery
Manual de jQuery
podemos ver a continuacin. //creo el plugin cuentaCaracteres jQuery.fn.cuentaCaracteres = function() { //para cada uno de los elementos del objeto jQuery this.each(function(){ //creo una variable elem con el elemento actual, suponemos un textarea elem = $(this); //creo un elemento DIV sobre la marcha var contador = $('<div>Contador caracteres: ' + elem.attr("value").length + '</div>'); //inserto el DIV despus del elemento textarea elem.after(contador); //guardo una referencia al elemento DIV en los datos del objeto jQuery elem.data("campocontador", contador); //creo un evento keyup para este elemento actual elem.keyup(function(){ //creo una variable elem con el elemento actual, suponemos un textarea var elem = $(this); //recupero el objeto que tiene el elemento DIV contador asociado al textarea var campocontador = elem.data("campocontador"); //modifico el texto del contador, para actualizarlo con el nmero de caracteres escritos campocontador.text('Contador caracteres: ' + elem.attr("value").length); }); }); //siempre tengo que devolver this return this; }; El cdigo est comentado para que se pueda entender mejor. Quizs nos pueda llamar ms la atencin la lnea donde se utiliza la funcin jQuery para generar sobre la marcha un objeto jQuery con el campo DIV con el que vamos a seguir la cuenta. Vemos que a travs del mtodo attr() accedemos al value del textarea y con la propiedad length a su longitud en caracteres. var contador = $('<div>Contador caracteres: ' + elem.attr("value").length + '</div>'); Luego tambin puede que nos llame la atencin el funcionamiento del mtodo data(), que nos permite almacenar y recuperar datos que se guardarn en el propio objeto jQuery de cada textarea. As guardo una referencia al objeto con la capa contador en el textarea, en un dato llamado "campocontador". elem.data("campocontador", contador); Y con este otro cdigo en el evento recupero esa capa, pues luego en el evento tengo que cambiar el contenido con la cuenta de caracteres actualizada. var campocontador = elem.data("campocontador"); Una vez creado el plugin, convierto todos los textareas en textareas-contador de caracteres, con este cdigo: $(document).ready(function(){
Manual de jQuery
$("textarea").cuentaCaracteres(); }) Eso es todo, pero quizs se vea ms claro si vemos el cdigo completo del ejemplo. <html> <head> <title>Creando plugins en jQuery</title> <script src="../jquery-1.4.1.min.js"></script> <script> //creo el plugin cuentaCaracteres jQuery.fn.cuentaCaracteres = function() { //para cada uno de los elementos del objeto jQuery this.each(function(){ //creo una variable elem con el elemento actual, suponemos un textarea elem = $(this); //creo un elemento DIV sobre la marcha var contador = $('<div>Contador caracteres: ' + elem.attr("value").length + '</div>'); //inserto el DIV despus del elemento textarea elem.after(contador); //guardo una referencia al elemento DIV en los datos del objeto jQuery elem.data("campocontador", contador); //creo un evento keyup para este elemento actual elem.keyup(function(){ //creo una variable elem con el elemento actual, suponemos un textarea var elem = $(this); //recupero el objeto que tiene el elemento DIV contador asociado al textarea var campocontador = elem.data("campocontador"); //modifico el texto del contador, para actualizarlo con el nmero de caracteres escritos campocontador.text('Contador caracteres: ' + elem.attr("value").length); }); }); //siempre tengo que devolver this return this; }; $(document).ready(function(){ $("textarea").cuentaCaracteres(); }) </script> </head> <body> <form> <textarea rows=5 cols=30 id="mitextarea">hola</textarea>
Manual de jQuery
<br> <br> <textarea rows=5 cols=30 id="otrotextarea">Otra cuenta...</textarea> </form> </body> </html> Este ejemplo se puede ver en una pgina aparte. Nota: Si quieres ver ms ejemplos prcticos de creacin de plugins te recomiendo que leas el Taller de JQuery.
Manual de jQuery
Manual de jQuery
rpidamente el objeto completo de configuracin del plugin que debe ser aplicado.
Manual de jQuery
$("p").miPlugin();
Manual de jQuery
Manual de jQuery
}); });
Mtodo jQuery.extend()
Quizs en este cdigo, lo que ms nos llame la atencin sea el lugar donde extiendo las opciones por defecto definidas en la variable "configuracion", con las opciones especficas para el plugin concreto, recibidas por medio del parmetro "opciones". jQuery.extend(configuracion, opciones); Esta sentencia es una llamada al mtodo extend() que pertenece a jQuery. Esta funcin recibe cualquier nmero de parmetros, que son objetos, y mete las opciones de todos en el primero. Luego, despus de la llamada a extend(), el objeto del primer parmetro tendr sus propiedades ms las propiedades del objeto del segundo parmetro. Si alguna de las opciones tena el mismo nombre, al final el valor que prevalece es el que haba en el segundo parmetro. Si tenemos dudas con respecto a este mtodo, leer el artculo jQuery.extend(). As, podemos ver cmo con extend() las propiedades por defecto del plugin se combinan con las que se enven en las opciones. Luego, en el cdigo del plugin, podremos acceder a las propiedades a travs de la variable configuracin, un punto y el nombre de propiedad que queramos acceder. configuracion.velocidad
Manual de jQuery
}); miTip.animate(configuracion.animacionMuestra, configuracion.velocidad); }); elem.mouseleave(function(e){ var miTip = $(this).data("capatip"); miTip.animate(configuracion.animacionOculta, configuracion.velocidad); }); }); return this; };
Manual de jQuery
Manual de jQuery
//cambio la variable comun a todos los elementos de este plugin mivariableComun = "Otra cosa comun!" } //puedo invocar las funciones del plugin miFuncion(); //evento, que tiene una funcin. Puedo acceder a variables y funciones del plugin elem.click(function(){ //puedo acceder a variables del plugin alert("Dentro del evento: " + miVariable); //puedo acceder a funciones miFuncion(); }); }); }; Para definir esas variables y funciones locales al plugin, de manera que estn accesibles dentro del plugin y a su vez tengan acceso a todos los datos del mismo, debemos colocarlas dentro de la iteracin que se hace con this.each(). Como se puede entender del cdigo del plugin anterior, todas esas variables y funciones se pueden invocar o acceder en cualquier parte, siempre y cuando estemos dentro del this.each(), donde fueron creadas. Este plugin, aunque no valga para mucho, lo hemos publicado y se puede ver en marcha en una pgina aparte. Nota: Antes del this.each() se pueden colocar tambin variables, pero tenemos que tener en cuenta que existir una misma copia de esa variable para todos los elementos donde se est aplicando el plugin. Veamos el siguiente HTML. <div id="esteDiv"> Este div </div> <span class="misspan">span1</span> <span class="misspan">span2</span> <span class="misspan">span3</span> Ahora veamos estas dos llamadas al plugin anterior. $("#esteDiv").miPlugin(); $(".misspan").miPlugin(); Como se puede ver, con la primera llamada se ejecuta el plugin sobre un elemento de la pgina con id="esteDiv". Es un nico elemento de la pgina, luego el plugin slo se aplica una vez. Sin embargo, en la segunda llamada, se ejecuta el plugin sobre varios elementos con la class de CSS "misspan". En este segundo caso el plugin se ejecutar sobre tres elementos y entonces
Manual de jQuery
podremos comprobar que las variables que se haban definido fuera del this.each() slo existen una vez y su valor es comn para los tres elementos sobre los que se aplic el plugin en la segunda llamada. Lo cierto es que quizs todo esto quede un poco confuso, o no se entienda muy bien para qu podremos querer todas esas variables y funciones locales al plugin. Pero a medida que vayamos trabajando y plantendonos plugins ms complicados, veremos que nos son de mucha utilidad para almacenar datos a los que queremos acceder ms tarde, o para organizar el cdigo de nuestro plugin en distintas funciones, que se pueden llamar repetidas veces y desde varios sitios. Para los que conocen un poco de programacin orientada a objetos, quizs les aclare un poco este simil: Si un plugin fuese como un objeto, las variables de dentro del bloque this.each() de los plugins seran como las propiedades de ese objeto y las funciones seran como mtodos de ese objeto. Aunque hay que salvar las distancias, porque un plugin no sigue exactamente el modelo que conocemos en las clases de programacin orientada a objetos. Para que veamos un caso prctico de plugin que tiene varias variables y funciones locales hemos realizado el ejemplo del siguiente artculo: Checkbox con diseo personalizado con jQuery. nos sirven para definir una mejor lgica de programacin y estructura de datos y cdigo.
Manual de jQuery
Un plugin en jQ
Manual de jQuery
cssElemento: { padding: "2px 2px 2px 24px", display: "block", margin: "2px", border: "1px solid #eee", cursor: "pointer" }, cssAdicional: { }, nameCheck: "" }; //Las extiendo con las opciones recibidas al invocar el plugin jQuery.extend(conf, opciones); this.each(function(){ //CDIGO DEL PLUGIN }); return this; }; Tal como se puede ver, se han definido varias variables para configurar el objeto, que se dispondrn en un objeto que tenemos en la variable "configuracion". Entre las variables de configuracin tenemos una llamada "activo" con un valor boleano para decidir si el elemento checkbox estara o no seleccionado desde el principio. Tenemos una variable "colorTextos", para definir el color del texto cuando el elemento est activo y pasivo. Tambin tenemos otra serie de configuraciones para los estados de activo y pasivo (seleccionado o no seleccionado), como la imagen que se tiene que mostrar al lado del texto. Ahora veamos el cdigo del plugin, lo que ira dentro de this.each(). Recordemos que cada variable creada aqu es accesible dentro de todo el bloque de cdigo definido por las llaves del this.each(). As mismo, las funciones declaradas aqu son accesibles desde cualquier parte de este bloque. //variables locales al plugin var miCheck = $(this); var activo = conf.activo //el elemento checkbox interno pero no visible var elementoCheck = $('<input type="checkbox" style="display: none;" />'); //el nombre del checkbox puede ser configurado desde options o con el propio texto del campo if(conf.nameCheck==""){ elementoCheck.attr("name", miCheck.text()); }else{ elementoCheck.attr("name", conf.nameCheck); }
Manual de jQuery
//inserto el checkbox en la pgina miCheck.before(elementoCheck); //aplico estilos que vienen en la configuracin miCheck.css(conf.cssElemento); miCheck.css(conf.cssAdicional); //si el elemento estaba marcado para estar activo if (activo){ //lo activo activar(); }else{ //lo desactivo desactivar(); } //defino un evento para el elemento miCheck.click(function(e){ //compruevo la variable activo, definida dentro del plugin if(activo){ desactivar(); }else{ activar(); } activo = !activo; }); //funcin local en el plugin para desactivar el checkbox function desactivar(){ //cambio los estilos para el elemento a los marcados como pasivos miCheck.css({ background: "transparent url(" + conf.imagen.pasivo + ") no-repeat 3px", color: conf.colorTextos.pasivo }); //si hay un texto especfico para cuando estaba pasivo if (conf.textos.pasivo!=""){ miCheck.text(conf.textos.pasivo) } //desmarcho el checkbox interno que es invisible, pero que se enva como elemento de formulario. elementoCheck.removeAttr("checked"); }; function activar(){ miCheck.css({
Manual de jQuery
background: "transparent url(" + conf.imagen.activo + ") no-repeat 3px", color: conf.colorTextos.activo }); if (conf.textos.activo!=""){ miCheck.text(conf.textos.activo) } elementoCheck.attr("checked","1"); }; El cdigo est convenientemente comentado para que se pueda entender mejor. Pero lo que queremos mostrar en este caso es que hemos creado dos funciones dentro del cdigo del plugin: activar() y desactivar(). Esas dos funciones, al estar dentro del bloque this.each(), se pueden acceder desde cualquier parte del plugin y comparten el mismo mbito de variables que el propio plugin, luego podremos acceder desde ellas a cualquier variable definida en el bloque this.each(). Para que quede un poco ms clara la estructura completa del plugin, coloco a continuacin su cdigo completo: jQuery.fn.checkboxPersonalizado = function(opciones) { //opciones de configuracin por defecto var conf = { activo: true, colorTextos: { activo: "#00f", pasivo: "#669" }, textos: { activo: "", pasivo: "" }, imagen: { activo: 'images/thumb_up.png', pasivo: 'images/thumb_down.png' }, cssElemento: { padding: "2px 2px 2px 24px", display: "block", margin: "2px", border: "1px solid #eee", cursor: "pointer" }, cssAdicional: { }, nameCheck: "" };
Manual de jQuery
//Las extiendo con las opciones recibidas al invocar el plugin jQuery.extend(conf, opciones); this.each(function(){ var miCheck = $(this); var activo = conf.activo var elementoCheck = $('<input type="checkbox" style="display: none;" />'); if(conf.nameCheck==""){ elementoCheck.attr("name", miCheck.text()); }else{ elementoCheck.attr("name", conf.nameCheck); } miCheck.before(elementoCheck); miCheck.css(conf.cssElemento); miCheck.css(conf.cssAdicional); if (activo){ activar(); }else{ desactivar(); } miCheck.click(function(e){ if(activo){ desactivar(); }else{ activar(); } activo = !activo; }); function desactivar(){ miCheck.css({ background: "transparent url(" + conf.imagen.pasivo + ") no-repeat 3px", color: conf.colorTextos.pasivo }); if (conf.textos.pasivo!=""){ miCheck.text(conf.textos.pasivo) } elementoCheck.removeAttr("checked"); }; function activar(){ miCheck.css({ background: "transparent url(" + conf.imagen.activo + ") no-repeat 3px",
Manual de jQuery
Manual de jQuery
}, nameCheck: "buen_tiempo" }); En este segundo caso de invocacin al plugin estamos convirtiendo en un checkbox personalizado el ltimo SPAN, que tena identificador "otro". En este segundo caso estamos utilizando multitud de variables de configuracin especficas, que harn que el checkbox tenga un aspecto radicalmente diferente a los anteriores. Para acabar, se puede ver el ejemplo en funcionamiento en una pgina aparte.
Manual de jQuery
Manual de jQuery
Manual de jQuery
Manual de jQuery
principio, los dos posibles valores son "swing" (por defecto) y "linear". Callback: Ofrece la posibilidad de indicar una funcin a ejecutarse cuando se ha terminado totalmente de producir el efecto. Es decir, una funcin que se invoca cuando se ha llegado al valor final de los atributos CSS que se solicitaron cambiar.
Manual de jQuery
$("#restaurar").click(function(e){ e.preventDefault() $("h1").css({ 'border-bottom-width': "1", 'font-size': '15pt' }); }); }) </script> </head> <body> <h1 style="border-bottom: 1px solid #ff8800; font-size: 15pt;">Animacion jQuery</h1> Trabajando con el mtodo animate: <a href="#" id="animar">Animar</a> <br> <br> Vuelvo a lo que haba antes: <a href="#" id="restaurar">Restaurar</a> </body> </html> Este ejemplo puede verse en marcha en una pgina aparte. CSS en un solo paso.
Manual de jQuery
Manual de jQuery
Con esto estamos haciendo que los elementos H1 de la pgina tengan una animacin que durar 3 segundos en la que pasarn del color que tuvieran definido normalmente hasta el color #f86.
Manual de jQuery
funcionalidad descrita. Si estaba iluminado, hago una animacin del atributo background-color hacia un color y si estaba oscurecido paso el background-color hacia otro color. El efecto no es nada del otro mundo, pero es bastante verstil y si tenis un bonito fondo con un patrn interesante, ms atractivo ser el resultado.
Conclusin
Hemos visto un par de animaciones con color, creadas con jQuery y un cdigo tan pequeo que es casi de risa. La ventaja del plugin que os hemos explicado es que no tienes que aprender nada nuevo, sino simplemente incluir su cdigo y estars en disposicin de hacer animaciones de color, como si jQuery siempre lo hubiera soportado en su conocido mtodo animate().
Manual de jQuery
Manual de jQuery
<li id="e2">Segundo elemento</li> <li id="e3">Tercer LI</li> </ul> Como vemos, tanto la lista (etiqueta UL) como los elementos (etiquetas LI) tienen identificadores (atributos id) para poder referirnos a ellos desde jQuery. Ahora veamos cmo hacer que la lista desaparezca con un fundido hacia transparente, a partir de una llamada a fadeOut(). $("#milista").fadeOut(); Como se puede ver, fadeOut() en principio no recibe ningn parmetro. Aunque luego veremos que le podemos pasar un parmetro con una funcin callback, con cdigo a ejecutarse despus de finalizado el efecto. Este sera el cdio para que la lista vuelva a aparecer, a travs de la restauracin de su opacidad con una llamada a fadeIn(). $("#milista").fadeIn();
Manual de jQuery
Con e.target.selectedIndex obtengo el ndice del elemento seleccionado, para poder acceder a la opcin seleccionada a travs del array de options. Con e.target.options[e.target.selectedIndex].value estamos accediendo a la propiedad value del OPTION que se encontraba seleccionado. As accedemos a la opacidad deseada que queramos aplicar. Una vez tenemos esa opacidad deseada, recogida del value del OPTION seleccionado, podemos ver la siguiente lnea de cdigo, en la que hacemos el fadeTo(). Veamos que fadeTo() recibe en principio dos mtodos. El primero es la duracin en milisegundos del ejemplo. El segundo es el valor de opacidad que queremos aplicar.
Manual de jQuery
Manual de jQuery
<a href="#" id="ocultartoda">ocultar toda la lista</a> | <a href="#" id="mostrartoda">Mostrar toda la lista</a> | <a href="#" id="ocultarmostrar">Ocultar la lista y luego mostrarla</a> </p> <form name="f1"> Cambia la opacidad del elemento H1 a: <select name="opacidad" id="selopacidad"> <option value="0.2">20%</option> <option value="0.5">50%</option> <option value="0.8">80%</option> <option value="1">100%</option> </select> <br> <a href="#" id="pororden">Cambiar la opacidad de los elementos de la lista por orden</a> </form> <ul id="milista"> <li id="e1">Elemento 1</li> <li id="e2">Segundo elemento</li> <li id="e3">Tercer LI</li> </ul> </body> </html> Si lo deseamos, podemos ver el ejemplo en marcha en una pgina aparte.
Manual de jQuery
Funciones de efectos
Vamos a repetir a lo largo de los siguientes artculos un concepto que quiero explicar para que se sepa a qu nos referimos. Se trata de las "Funciones de efectos" que son aquellas que dispone jQuery para crear efectos especiales en pginas web. Como hemos dicho, en diversos artculos anteriores ya se han explicado y mostrado efectos de diversas de las funciones de efectos disponibles. Las funciones de efectos son los mtodos jQuery que realizan un cambio en los elementos de la pgina de manera suavizada, es decir, que alteran las propiedades de uno o varios elementos progresivamente, en una animacin a lo largo de un tiempo. Por poner un ejemplo, tenemos el mtodo fadeOut(), que realiza un efecto de opacidad sobre uno o varios elementos, haciendo que stos desaparezcan de la pgina con un fundido de opaco a transparente. El complementario mtodo fadeIn() hace un efecto de fundido similar, pero de transparente a opaco. Como stos, tenemos en jQuery numerosos mtodos de efectos adicionales como animate(), sliceUp() y sliceDown(), etc. En la propia documentacin del framework, en el apartado Effects de la referencia del API, podremos ver una lista completa de estas funciones de efectos. En este Manual de jQuery ya hemos visto varios ejemplos sobre estas funciones de efectos y a lo largo de los prximos artculos que publicaremos en desarrolloweb .com veremos diversas otras aplicaciones de muestra donde podremos seguir aprendiendo.
Manual de jQuery
tiene su propia cola de efectos predeterminada y funciona de manera automtica. Al invocar los efectos se van metiendo ellos mismos en la cola y se van ejecutando automticamente, uno detrs de otro, con el orden en el que fueron invocados. capa = $("#micapa"); capa.fadeOut(); capa.fadeIn(); capa.slideUp(); capa.slideDown(); Las funciones de efectos, una detrs de otra, se invocan en un instante, pero no se ejecutan todas a la vez, sino que se espera que acabe la anterior antes de comenzar la siguiente. Por suerte, jQuery hace todo por su cuenta para gestionar esta cola. Como decimos, cada elemento de la pgina tiene su propia cola de efectos y, aunque incluso podramos crear otras colas de efectos para el mismo elemento, en la mayora de los casos tendremos suficiente con la cola por defecto ya implementada .
Manual de jQuery
efectos, se volver a invocar a la funcin y se producir as un bucle infinito, donde se repetir todo el tiempo la misma secuencia de efectos. Y ahora podemos poner en marcha esta funcin cuando la pgina est lista: $(document).ready(function(){ colaEfectos(); }); El resultado del ejercicio completo se puede ver en una pgina aparte. Con esto hemos hecho nuestro primer ejemplo de cola de efectos. Ha sido fcil, no? Pero claro que a partir de aqu la cosa se puede complicar todo lo que deseemos, o necesitemos. En el prximo artculo empezaremos a explicar el modos existentes en jQuery para alterar las colas de efectos, para hacer cosas como detenerlas, analizarlas, cargar funciones de otros tipos para ejecutar en la cola, etc.
Manual de jQuery
Mtodo queue([nombreCola])
Si llamamos al mtodo queue() sin parmetros o pasndole una cadena con el nombre de una cola, nos devolver un array con cada una de las funciones que estn encoladas en ese momento. Si no indicamos parmetros a queue() estamos indicando que nos pase la lista de eventos encolados en la cola predeterminada. Si se indica un parmetro de tipo cadena, que sera el nombre de la cola a examinar, lo que nos devuelve es el array de funciones de la cola con nombre indicado en el parmetro. Nota: El nombre de la cola predeterminada es "fx", por lo que llamar a la funcin: elemento.queue("fx"); Tendra el mismo efecto que llamarla sin parmetros. elemento.queue(); Veremos un ejemplo sencillo de esta posible invocacin del mtodo queue() y adems, aparte vamos a ver que se pueden encolar funciones en la cola tantas veces como queramos, aunque la cola est en marcha. El efecto es que esas funciones encoladas posteriormente se quedarn al final de la cola y se ejecutarn cuando el resto de la cola se haya ejecutado. Si lo deseamos, antes de ponernos a comentar este ejemplo, podemos ver el ejercicio en marcha que vamos a construir. Tenemos el siguiente HTML, que incluye varios elementos: <button id="botonfade">Muestra y luego oculta con fadeIn y fadeOut</button> <button id="botonslide">Muestra y luego oculta con slideUp slideDown</button> <button id="botontamanocola">Muestra el nmero de funciones en cola ahora mismo</button> <div id="mensaje"> En estos momentos no hay funciones de efectos en la cola por defecto. <br>
Manual de jQuery
<span class="notar">Pulsa repetidas veces los botones de arriba para ir metiendo funciones en la cola</span> </div> <div id="micapa"></div> Como se puede ver tenemos tres botones. Uno sirve para agregar funciones en la cola para hacer efectos fadeIn() y fadeOut(), el segundo para agregar a la cola funciones de efectos slideUp() y slideDown() y el tercero para mostrar la longitud de la cola en un momento dado. Luego tenemos una capa para mostrar mensajes y otra con id="micapa" que ser el DIV que vamos a animar con los efectos. As podremos definir el evento onclick del primer botn: $("#botonfade").click(function(){ capa = $("#micapa"); capa.fadeOut(500); capa.fadeIn(500); muestraRestantesCola(); }); As podemos definir el evento onclick del segundo: $("#botonslide").click(function(){ capa = $("#micapa"); capa.slideUp(500); capa.slideDown(500); muestraRestantesCola(); }); Estos dos botones, como se puede ver, ejecutan efectos sobre "micapa" y el resultado es que, a medida que pulsamos los botones repetidas veces, los efectos se van encolando. Podemos pulsar tantas veces como queramos y se irn encolando ms y ms efectos en la cola predeterminada. Al ejecutar estos eventos click, como ltima sentencia hay una llamada a la funcin muestraRestantesCola(), que veremos ahora mismo. Pero antes veamos el tercer botn, que sirve para mostrar el nmero de elementos de la cola predeterminada. $("#botontamanocola").click(function(){ muestraRestantesCola(); }); Como se ve, se llama a la funcin muestraRestantesCola(), que simplemente accede a la cola para saber el nmero de funciones de efectos encoladas en un momento dado. Su cdigo es el siguiente: function muestraRestantesCola(){ var numFuncionesEnCola = $("#micapa").queue().length; $("#mensaje").text("En el momento de hacer el ltimo clic en los botones hay " + numFuncionesEnCola + " funciones de efectos en cola"); } En la primera sentencia se accede al la cola predeterminada del elemento con id="micapa", lo que nos devuelve un array, al que luego se accede a su propiedad "length" para saber el nmero de elementos que contiene. Con esto averiguamos el nmero de funciones encoladas
Manual de jQuery
en un momento dado. Luego se muestra ese nmero en la capa con id="mensaje". Podemos ver el cdigo completo de este ejercicio. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html lang="en"> <head> <title>Cola de efectos por defecto en jQuery</title> <script src="../jquery-1.4.2.min.js" type="text/javascript"></script> <style type="text/css"> body{ font-size: 0.75em; font-family: tahoma, verdana, sans-serif; } .notar{ color: #339; } #mensaje{ margin: 20px 5px; } #micapa{ left: 200px; top: 150px; position: absolute; width: 50px; height: 50px; background-color: #3d3; } </style> <script languague="javascript"> function muestraRestantesCola(){ var numFuncionesEnCola = $("#micapa").queue().length; $("#mensaje").text("En el momento de hacer el ltimo clic en los botones hay " + numFuncionesEnCola + " funciones de efectos en cola"); } $(document).ready(function(){ $("#botonfade").click(function(){ capa = $("#micapa"); capa.fadeOut(500); capa.fadeIn(500); muestraRestantesCola(); }); $("#botonslide").click(function(){ capa = $("#micapa");
Manual de jQuery
capa.slideUp(500); capa.slideDown(500); muestraRestantesCola(); }); $("#botontamanocola").click(function(){ muestraRestantesCola(); }); }); </script> </head> <body> <button id="botonfade">Muestra y luego oculta con fadeIn y fadeOut</button> <button id="botonslide">Muestra y luego oculta con slideUp slideDown</button> <button id="botontamanocola">Muestra el nmero de funciones en cola ahora mismo</ button> <div id="mensaje"> En estos momentos no hay funciones de efectos en la cola por defecto. <br> <span class="notar">Pulsa repetidas veces los botones de arriba para ir metiendo funciones en la cola</span> </div> <div id="micapa"></div> </body> </html> Ahora, para acabar, podemos ver el ejercicio en marcha en una pgina aparte. En el siguiente artculo continuaremos con el trabajo con colas de efectos y aprenderemos a encolar funciones que no son las de efectos de jQuery, de modo que podramos meter nuestras propias funciones en la cola, con cualquier tipo de instruccin.
Manual de jQuery
encolarla nosotros mismos explcitamente y para ello tendremos que utilizar el mtodo queue() de jQuery. Nota: El mtodo queue() funciona de maneras distintas dependiendo de los parmetros que le enviemos. En el anterior artculo ya empezamos a explicar cmo utilizar queue() para acceder a una cola de efectos.
Manual de jQuery
continuacin. capa.queue(function(continua){ alert("Hola, esto es un cdigo cualquiera"); //el parmetro continua es una funcin para ir al siguiente paso de la cola continua(); });
Manual de jQuery
"height": "50px", "width": "400px" }, 1000); }); El resultado de ejecutar este cdigo Javascript se puede ver en una pgina aparte. En el siguiente artculo veremos el ltimo uso que nos queda por explicar del mtodo queue() y de paso, otro mtodo interesante, stop(), que sirve para detener la ejecucin de una cola.
Manual de jQuery
Manual de jQuery
repentinamente. Podemos ver varios ejemplos: $("#elemento").stop(); Esto terminara con el efecto que se est ejecutando en la cola, pero continuara con los siguientes efectos que pudiera haber encolados. $("#elemento").stop(true); Terminara con el efecto que se est realizando y limpiara la cola, con lo que no se ejecutaran otras funciones que pudiera haber. $("#elemento").stop(false, true); Terminara el efecto actual pero saltara en la animacin para mostrar directamente el estado al que se llegara si el efecto huviese continuado hasta el final. Luego continuara automticamente con la siguiente funcin de la cola.
Manual de jQuery
$("button.botondetener").show(500); continua(); }); //2 animaciones que tardan mucho capa.animate({"left": "0px"}, 5000); capa.animate({"left": "200px"}, 5000); capa.queue(function(continua){ $("button.botondetener").hide(500); continua(); }); }); Como vemos, tenemos una serie de funciones que se van a encolar. Como primer paso de la animacin se hace una instruccin para que se muestren los botones que no estaban visibles. Luego hacemos dos efectos animados, a los que les ponemos una duracin de 5 segundos cada uno, lo suficiente para que nos de tiempo a detener la animacin antes que estos efectos se lleguen a completar. Ahora veamos los distintos eventos click para los botones que pararn la animacin, con varios comportamientos ligeramente distintos. $("#botonparar").click(function(){ $("#micapa").stop(); }); Con esta funcin conseguiremos que se pare el paso actual de la animacin, pero se continuar con el siguiente paso que haya en la cola de efectos. $("#botonpararllegar").click(function(){ $("#micapa").stop(false, true); }); Con esta funcin hacemos que se detenga el paso actual de la animacin, pero llevamos el elemento al lugar donde hubiera llegado si la animacin hubiese continuado hasta el final. Luego contina con los siguientes efectos encolados. $("#botonparartodo").click(function(){ $("#micapa").queue([]); $("#micapa").stop(); //Esto mismo podra haberse hecho tambin as: //$("#micapa").stop(true); alert("Lo he parado todo!, ni se ocultarn los botones de parar. Pasos encolados: " + $("#micapa").queue().length) }); Esta funcin es la ms compleja de todas, pero realmente lo es porque he decidido complicarme un poco la vida. Veamos por qu. $("#micapa").queue([]); Con esto estoy cambiando la cola por defecto del elemento con id="micapa". Y esamos asignando una cola de efectos vaca, porque el array enviado como parmetro no tiene
Manual de jQuery
elementos. Con eso consigo quitar todas las funciones de la cola, pero hay que tener en cuenta que alguno de los efectos puede estar ejecutndose todava y lo puedo parar con la sentencia: $("#micapa").stop(); Con eso consigo que la animacin se detenga tal como estuviera en ese mismo instante. Esto, si lo preferimos, se podra haber conseguido con una simple llamada al mtodo stop(): $("#micapa").stop(true); Para acabar, lanzo un mensaje al usuario, en una simple caja de alert(), para indicar los pasos que quedaron encolados en ese momento, que son cero, dado que hemos retirado todas las funciones de la cola. Eso es todo, si lo deseas, puedes verlo en marcha en esta pgina aparte. Ya hemos avanzado bastante en nuestro anlisis sobre las colas de efectos de jQuery, pero aun nos quedan algunas cosas ms que deberamos aprender. En el prximo artculo aprenderemos a manejar el mtodo delay() que nos servir para crear intervalos de espera entre la ejecucin de elementos de la cola.
Manual de jQuery
Manual de jQuery
y aplicamos varios retardos entre ellos. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html lang="en"> <head> <title>Cola con delay()</title> <script src="../jquery-1.4.2.min.js" type="text/javascript"></script> <style type="text/css"> #micapa{ left: 20px; top: 20px; position: absolute; font-size: 0.75em; font-family: tahoma, verdana, sans-serif; width: 740px; background-color: #ddf; padding: 10px; border: 1px solid #bbb; } </style> <script languague="javascript"> function colaEfectos(){ capa = $("#micapa"); capa.slideUp(1000); capa.delay(2000) capa.slideDown(1000); capa.fadeTo(1500, 0.3).delay(3000).fadeTo(500, 1); capa.delay(500); capa.animate({ "font-size": "+=0.5em" }, 1000, colaEfectos); //alert (capa.queue().length) } $(document).ready(function(){ colaEfectos(); }); </script> </head> <body> <div id="micapa">Vamos a ejecutar varios mtodos para hacer una cola de efectos, pero
Manual de jQuery
vamos a ponerles un retardo entre unos y otros.</div> </body> </html> Podemos ver el ejemplo en funcionamiento en una pgina aparte. Ahora que ya hemos hecho mltiples ejemplos de trabajo con colas de efectos, siempre con la cola de efectos predeterminada, vamos a aprender en el prximo artculo cmo trabajar con otras colas de efectos distintas.
Manual de jQuery
Manual de jQuery
la cola de efectos predeterminada. Al final de esta funcin, en la ltima llamada a animate(), realizamos un callback para invocar de nuevo a ocultaMuestra() y as generar un bucle infinito de efectos. Ahora podemos ver la funcin que realizar una cola de efectos distinta de la predeterminada. function cambiarColores(){ capa = $("#micapa"); capa.queue("micola", function(){ $(this).css({ "background-color": "#339" }); setTimeout("capa.dequeue('micola')", 1000); }); capa.queue("micola", function(){ $(this).css({ "background-color": "#933" }); setTimeout("capa.dequeue('micola')", 1000); }); capa.queue("micola", function(){ $(this).css({ "background-color": "#393" }); setTimeout("cambiarColores()", 1000); }); capa.dequeue("micola"); } La funcin cambiarColores(), que acabamos de ver, encola varias funciones y lo hace en una cola de efectos llamada "micola". Como todas las funciones que se meten en "micola" no son de efectos (porque si no, se encolaran en la cola predeterminada), tenemos que encolarlas con el mtodo queue(), indicando la cola con la que estamos trabajando y la funcin a encolar en ella. Antes de acabar cualquier funcin de las que metemos en "micola", tenemos que llamar a dequeue("micola") indicando como parmetro la cola en la que queremos progresar al siguiente elemento encolado. Ese dequeue() se realiza adems con un setTimeout() para retrasar un poco la ejecucin de las siguientes funciones. Al final de cdigo de la funcin cambiarColores() hay un dequeue("micola") que sera necesario para que, una vez definida la cola, se comience la ejecucin con la primera funcin de la misma. Otra posibilidad para la funcin cambiarColores() pero un poco ms avanzada y que ser til de mostrar, ya que en el artculo anterior aprendimos a trabajar con el mtodo delay(), sera la siguiente: function cambiarColores(){ capa = $("#micapa"); capa.delay(1000, "micola");
Manual de jQuery
capa.queue("micola", function(sig){ $(this).css({ "background-color": "#339" }); sig() }); capa.delay(1000, "micola"); capa.queue("micola", function(sig){ $(this).css({ "background-color": "#933" }); sig(); }); capa.delay(1000, "micola"); capa.queue("micola", function(){ $(this).css({ "background-color": "#393" }); cambiarColores(); }); capa.dequeue("micola"); } La diferencia es que hemos modificado los setTimeout() por llamadas al mtodo delay(1000, "micola"), que produce un retardo de 1 segundo antes de pasar al siguiente elemento de la cola "micola". Adems, dentro de las funciones que insertamos con queue(), llamamos a la siguiente fase de la cola a travs del parmetro "sig", que tiene una referencia a la siguiente funcin de la cola Podemos ver este ejemplo con su cdigo completo: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html lang="en"> <head> <title>Otra cola de efectos</title> <script src="../jquery-1.4.2.min.js" type="text/javascript"></script> <style type="text/css"> body{ font-size: 0.75em; font-family: tahoma, verdana, sans-serif; } #mensaje{ margin: 20px 5px; }
Manual de jQuery
#micapa{ left: 100px; top: 150px; position: absolute; width: 50px; height: 50px; background-color: #3d3; } </style> <script languague="javascript"> function muestraRestantesCola(){ var funcionesEnCola = $("#micapa").queue("micola").length; var funcionesEnColaPredeterminada = $("#micapa").queue().length; //console.log("Cola 'micola':", $("#micapa").queue("micola")); var textoMostrar = "Hay " + funcionesEnCola + " funciones de efectos en la cola 'micola'"; textoMostrar += "<br>Hay " + funcionesEnColaPredeterminada + " funciones de efectos en la cola por defecto"; $("#mensaje").html(textoMostrar); } function cambiarColores(){ capa = $("#micapa"); capa.delay(1000, "micola"); capa.queue("micola", function(sig){ $(this).css({ "background-color": "#339" }); sig() }); capa.delay(1000, "micola"); capa.queue("micola", function(sig){ $(this).css({ "background-color": "#933" }); sig(); }); capa.delay(1000, "micola"); capa.queue("micola", function(sig){ $(this).css({ "background-color": "#393" }); cambiarColores();
Manual de jQuery
}); capa.dequeue("micola"); } /* POSIBILIDAD PARA HACER ESTA MISMA FUNCIN PERO CON SETTIMEOUT EN VEZ DE DELAY function cambiarColores(){ capa = $("#micapa"); capa.queue("micola", function(){ $(this).css({ "background-color": "#339" }); setTimeout("capa.dequeue('micola')", 1000); }); capa.queue("micola", function(){ $(this).css({ "background-color": "#933" }); setTimeout("capa.dequeue('micola')", 1000); }); capa.queue("micola", function(){ $(this).css({ "background-color": "#393" }); setTimeout("cambiarColores()", 1000); }); capa.dequeue("micola"); } */ function ocultaMuestra(){ capa = $("#micapa"); capa.fadeTo(500, 0.3); capa.fadeTo(1200, 1); capa.animate({ "left": "350px" },1200); capa.animate({ "left": "100px" },1000, ocultaMuestra); } $(document).ready(function(){
Manual de jQuery
cambiarColores(); ocultaMuestra(); $("#botontamanocola").click(function(){ muestraRestantesCola(); }); }); </script> </head> <body> <button id="botontamanocola">Muestra el nmero de funciones en cola ahora mismo</ button> <div id="mensaje"> </div> <div id="micapa"></div> </body> </html> Para acabar, colocamos el enlace al ejemplo en marcha. Con esto hemos terminado todo lo que queramos explicar sobre colas de funciones para realizar todo tipo de efectos complejos en jQuery. Esperamos que se haya podido entender y a partir de aqu el lector sea capaz de aplicar los conocimientos para implementar efectos especiales en scrips complejos con jQuery. En el prximo artculo aplicaremos los conocimientos sobre colas de efectos para mejorar el plugin del navegador desplegable en jQuery para aplicar efectos especiales.
Manual de jQuery
Manual de jQuery
de "options" para configurar un plugin, pero realmente es una accin que encontraremos por ah varias veces. De alguna manera, hacer un extend() es como hacer que un objeto herede las cosas de otro, lo que lo convierte en un mecanismo que podr venir bien en diversos contextoPara ver otros ejemplos de extend() consultar el Manual de jQuery, en la seccin donde se habla de la configuracin de opciones en plugins en jQuery.
Manual de jQuery
49. $.get() de jQuery para hacer una solicitud Ajax tipo HTTP GET
Anlisis y ejemplos de la funcin $.get() de jQuery que sirve para hacer una solicitud Ajax al servidor en la que podemos enviar datos por el mtodo GET. En el Manual de jQuery ya habamos tratado con anterioridad el Ajax en este framework Javascript, principalmente para demostrar hasta qu punto era sencillo hacer una conexin asncrona con el servidor por medio del mtodo load(). Incluso habamos ido un poco ms lejos, sin abandonar la facilidad, implementando un script Ajax con el tpico mensaje de carga. En el presente artculo vamos a empezar a explorar algunas otras funciones existentes en jQuery que sirven para hacer Ajax y algunos usos un poco ms avanzados, que nos permitirn ampliar nuestras habilidades y el tipo de problemas que podamos enfrentar. Comenzaremos por el mtodo $.get(), que como veremos es casi tan sencillo como el ya comentado mtodo load(). Hasta el momento, con el mtodo load() habamos aprendido a hacer una solicitud Ajax y a cargar en un elemento de la pgina el HTML resultante de esa solicitud. El mtodo $.get(), a diferencia de load() no vuelca el resultado de la solicitud en ningn sitio de manera predeterminada, sino que simplemente se dedica a realizar la conexin con el servidor y recibir la respuesta. Esto no quiere decir que luego no podamos volcar el resultado de la solicitud en el HTML de una capa o cualquier otro elemento de la pgina, sino que para conseguirlo, deberemos especificarlo en el cdigo de nuestro script. De esto podemos deducir que $.get() no tiene un funcionamiento predeterminado (es decir, y no hace nada fijo con la respuesta de la solicitud Ajax) y por tanto, nosotros podemos programar cualquier comportamiento que deseemos en nuestras aplicaciones. Nota: el mtodo $.get() tambin lo podremos encontrar nombrado como jQuery.get() ya que $ es una abreviacin del objeto jQuery. En este primer artculo vamos a dedicarnos a hacer una lista de ejemplos de dificultad creciente con el mtodo $.get(), que nos sirvan para entender cmo funciona. Como muchos de los mtodos de jQuery, $.get() vara su comportamiento dependiendo de los parmetros que le enviemos.
$.get(URL)
Si a $.get() le pasamos una cadena con una URL, el mtodo hace una solicitud Ajax a dicha URL, pero no hace nada con la respuesta obtenida del servidor. $.get("contenido-ajax.html"); Es decir, si ejecutamos ese cdigo anterior, el navegador cursar la solicitud Ajax de la pgina "contenido-ajax.html" y con ello obtendr una respuesta. Sin embargo, no har nada con esa respuesta una vez recibida y por tanto no veremos ningn resultado en el navegador.
$.get(URL, funcion)
En este segundo caso, estamos pasando dos parmetros, el primero la URL de la solicitud Ajax a realizar y el segundo una funcin con el cdigo a ejecutar cuando se reciba la respuesta,
Manual de jQuery
que incluir todas las acciones a realizar cuando se reciba. En esa funcin a su vez recibimos varios parmetros, siendo el ms importante el primero, en el que tendremos una referencia al resultado de la solicitud realizada. Lo vemos con un ejemplo: $.get("contenido-ajax.html", function(respuestaSolicitud){ alert(respuestaSolicitud); }) En este caso hacemos una solicitud al archivo "contenido-ajax.html". Luego, cuando se reciba la respuesta se ejecutar el cdigo de la funcin. En la funcin recibimos un parmetro " respuestaSolicitud", que contendr el cdigo HTML devuelto por el servidor al solicitar esa pgina por Ajax. Como se puede ver, en la funcin simplemente mostramos en una caja de alerta el contenido de la respuestaSolicitud. Ese cdigo en marcha se puede ver en una pgina aparte.
Manual de jQuery
el servidor recibimos un dato en notacin JSON, que es un tipo de respuesta bastante utilizado en las aplicaciones web del lado del cliente. En este ejemplo hemos complicado un poco nuestro script, para que se vea cmo con $.get() podemos hacer cosas muy diversas con la respuesta y no solo escribirla en la pgina o en una caja de dilogo. Para ello tenemos simplemente que complicar todo lo que queramos la funcin que recibe la respuesta y hace cosas con ella. En este caso, como recibimos un archivo en notacin JSON, podemos hacer cosas distintas dependiendo del contenido de ese JSON. El ejemplo siguiente hace un rudimentario clculo del precio final de un producto, que sera la base imponible ms el IVA. Adems, en este supuesto ejercicio podramos tener varios tipos de clientes, por ejemplo espaoles (a los que hay que aplicarles el impuesto IVA) o extranjeros, que estn exentos de pagar tal impuesto. Tenemos un par de botones, con un par de casos de productos: <button id="coniva">Calcular precio 20 para cliente espaol (hay que cobrar IVA)</button> <button id="siniva">Calcular precio 300 para cliente de Brasil (no se le cobra IVA)</button> Como se ve, un botn tiene un precio para cliente espaol y otro para un cliente brasileo. La funcionalidad de esos botones podramos expresarla generando un de evento click, para cada uno de los botones: $("#coniva").click(function(){ $.get("recibe-parametros-devuelve-json.php", muestraPrecioFinal, "json"); }) $("#siniva").click(function(){ {pais: "ES", precio: 20},
$.get("recibe-parametros-devuelve-json.php", {pais: "BR", precio: 300}, muestraPrecioFinal, "json"); }) El detalle que tenemos que reparar en este cdigo es que estamos enviando un ltimo parmetro a la funcin $.get() con el valor "json". Con eso indicamos que la respuesta del servidor se espera con notacin JSON. Adems, como se puede ver, los botones invocan a la misma pgina recibe-parametros-devuelve-json.php, pero se les pasa datos distintos por GET al servidor. Tambin hay una nica funcin "muestraPrecioFinal" que se encargar de mostrar el precio final en la pgina. Esa funcin la hemos definido aparte, con el siguiente cdigo: function muestraPrecioFinal(respuesta){ $("#base").html("Precio final: " + respuesta.preciofinal); if (respuesta.tieneiva=="1"){ $("#base").css("background-color", "#ffcc00"); }else{ $("#base").css("background-color", "#cc00ff"); $("#base").append($('<span class="clienteext">No se aplica IVA por ser cliente extranjero</ span>')); } } Con esta funcin queramos demostrar cmo se pueden hacer cosas distintas dependiendo de
Manual de jQuery
la respuesta. En concreto, en este ejemplo, para el caso de ser cliente espaol o extranjero se realizan acciones ligeramente diferentes. Adems, en la funcin recibimos un parmetro "respuesta". En este caso, como lo que recibamos es una respuesta en JSON, dicha variable tendr diferentes datos que podemos acceder como si fueran propiedades de un objeto. Por ejemplo, respuesta.preciofinal tiene el valor de precio total, una vez aplicado el IVA o no dependiendo de la nacionalidad del cliente. Por su parte, respuesta.tieneiva nos sirve para saber si corresponda o no aplicar IVA a ese cliente. Nos quedara por ver la pgina PHP recibe-parametros-devuelve-json.php, que contiene el cdigo para recibir los datos por GET y generar el JSON adecuado para la respuesta de la solicitud Ajax. <?php if ($_GET["pais"]!="ES"){ echo json_encode(array("tieneiva"=>"0", "preciofinal"=>$_GET["precio"])); }else{ echo json_encode(array("tieneiva"=>"1", "preciofinal"=>($_GET["precio"] * (18 / 100)) + $_GET["precio"])); } ?> Este ejemplo de Ajax con respuesta en formato JSON lo podemos ver en una pgina aparte. En el siguiente artculo veremos cmo podemos aplicar unos eventos a este mtodo $.get() para poder hacer cosas cuando la solicitud se complete, con xito o con error.
Manual de jQuery
Manual de jQuery
19. Como la URL que invocamos desde $.get() no existe, se producir un evento error, que definimos con el mtodo error(), pasndole la funcin que queremos ejecutar. Simplemente mostraremos un mensaje de error por medio de una caja alert. 20. Ese ejemplo est disponible para su ejecucin en una pgina aparte. 21.
22. En este segundo ejemplo hacemos los dos eventos que nos faltaban por ver, que son success y complete. Adems, vamos a demostrar cul es el orden de ejecucin de los mismos, por medio de mensajes en cajas de alert. 23.Existen tres pasos distintos que produce la solicitud y cdigo fuente que podemos colocar en distintas partes del script que se ejecutar en un orden predefinido. a. Primero se ejecuta la funcin que se escribe en jQuery.get() para definir acciones con la respuesta de la solicitud. b. Seguidamente se ejecuta la funcin que se asigne al evento success. c. Por ltimo se ejecuta la funcin asignada al evento complete. 24. Nota: recordar adems que el evento complete se ejecutara tanto si la solicitud ajax tiene xito como fracaso, mientras que success solo se ejecuta cuando la solicitud se realiz con xito. 25. var objajax = $.get("contenido-ajax.html", function(respuesta){ 26. alert("paso 1"); 27. }); 28. objajax.success(function(){ 29. alert("paso 2"); 30. }); 31. objajax.complete(function(){ 32. alert("paso 3"); 33. }); 34. Si ejecutamos ese cdigo (recordar de hacerlo con jQuery 1.5 o superior) se podr ver que se lanzan tres cajas de dilogo producidas por los tres "pasos" de la solicitud Ajax. Eso siempre y cuando la llamada a la pgina contenido-ajax.html se ejecute con xito, porque si hubiera un fallo en tal conexin slo veramos la caja de alert del "paso 3", que es la del evento complete. 35. Puedes ver una pgina con el ejemplo en marcha. 36. En el siguiente artculo continuaremos viendo algunos detalles importantes de los eventos en las solicitudes Ajax y es que, adems en ellos podemos recibir varios parmetros con los que operar para realizar acciones determinadas.
Manual de jQuery
Manual de jQuery
le enviamos la funcin a ejecutar cuando se produzca el error y vemos que se le pasan tres parmetros. Con los parmetros "estado" y "excepcion" simplemente los mostramos en una caja de alert, para poder verlos. Con el parmetro "o", que es una referencia al objeto Ajax que se est ejecutando, podemos, por hacer alguna cosa, como cargar otro evento. En este caso cargamos una funcin adicional al evento "complete", y digo adicional porque en la ltima lnea de este cdigo ya habamos cargado algo al evento complete. Por tanto, si se ha entendido bien, se comprobar que: Si la solicitud Ajax tuvo xito, no se hace nada en concreto, pero se obtendr un mensaje diciendo "Solicitud completada" Si la solicitud Ajax fall, tampoco hacemos nada en concreto, pero veremos varios mensajes. El primero para decir cul es el texto asociado a este error y la excepcin producida, en caso que haya alguna. El segundo mensaje que veremos, por ltimo y tambin cuando se complete la solicitud, ser el de "Solicitud completada evento cargado desde el evento de error!" Puedes ver el ejemplo en marcha para comprobar por ti mismo ese funcionamiento.
Manual de jQuery
$("#estadocomplete").html(textostatus); }); Como se puede ver, se inicia una solicitud Ajax con $.get(), pero no colocamos en la solicitud nada a realizar cuando sta se reciba, pues ms adelante definiremos qu hacer en caso que se produzca un error o en caso que se ejecute con xito. Con el mtodo error() definimos el evento a ejecutarse en el caso que la consulta a la pgina incrementa-me-gusta.php no pueda ser realizada. En ese caso, simplemente mostramos un mensaje de error. Con el evento success, definido por medio del mtodo success(), definimos las acciones a realizar en caso que se ejecute la solicitud con xito. Como se puede ver, en el evento se reciben dos parmetros, uno con la respuesta y el segundo con el texto de estado. Con la respuesta podemos hacer acciones, al igual que con el texto de estado. Ambos datos los mostramos en la pgina en distintos lugares. Luego se define el evento complete, que recibe tambin un par de parmetros. Por un lado tenemos el objeto ajax que ha recibido la solicitud, con el que no hacemos nada. Luego tenemos el texto de estado, que simplemente lo mostramos en la pgina. El ejemplo se puede ver en una pgina aparte. Por el momento es todo lo que queramos mostrar del mtodo jQuery.get(), as que ya en el prximo artculo veremos una funcin parecida pero que hace las conexiones Ajax por medio de POST en vez de GET, con el objetivo final de mostrar cmo enviar formularios por Ajax con jQuery.