jQuery es un una biblioteca o framework de Javascript que permite simplificar la manera de interactuar con los documentos HTML, permitiendo manejar eventos, desarrollar animaciones y agregar la tecnología AJAX a nuestras páginas web. jQuery, al igual que otras bibliotecas, ofrece una serie de funcionalidades basadas en Javascript que de otra manera requerirían de mucho más código.
La elección de jQuery, en detrimento de otros frameworks AJAX y Javascript se base fundamental en la expansión que actualmente tiene en el mundo del desarrollo web (ver siguiente figura). También posee una librería de interfaz de usuario (jQuery UI) que incorpora efectos gráficos y de usabilidad con capacidades Drag&Drop (arrastrar y colocar), animaciones y otro elementos gráficos y de interfaz amigable. Por último , jQuery tiene el apoyo de Google, Nokia y Microsoft, incluyendose dentro del entorno de desarrollo Visual Studio.
El núcleo de Jquery esta compuesto por un único archivo Javascript que contiene todos los objetos y funciones que vamos a necesitar para empezar a realizar nuestros primeros scripts con funcionalidades AJAX. Podemos encontrar dos versiones de este fichero en la dirección: http://docs.jquery.com/Downloading_jQuery. La primera versión “Minified” es el fichero que usaremos en producción, esta escrito para ocupar el mínimo espacio, no contiene comentarios y el código esta escrito sin espaciados ni sangrías lo que hace su entendimiento y modificación una tarea extremadamente costosa. La segunda versión “Uncompressed” es la usada en desarrollo y la que vamos a utilizar. Esta comentada y permite entender sus funciones y objetos. Una vez hayamos descargado el fichero .js con la última versión de desarrollo de jQuery bastará con incluirlo en la cabecera del fichero HTML de la siguiente manera:
<head>
<script type="text/javascript" src="jquery.js"></script>
</head>
Vamos a empezar nuestro aprendizaje del núcleo de jQuery con los selectores CSS que nos permitirán modificar los atributos y el comportamiento de los diferentes elementos de nuestras paginas web. Hasta ahora, cada vez que queríamos acceder a un elemento de nuestra página mediante Javascript utilizábamos varios métodos. Por ejemplo para rescatar el valor del input de un formulario lo podíamos hacer de la forma document.name_del_formulario.name_del_input.value o atacando directamente el identificador con document.getElementById('identificador_del_input'). Al mismo tiempo en nuestras hojas CSS utilizábamos selectores para establecer que propiedades iban a tener los diferentes elementos de la página. Un punto seguido de un nombre (.nombre_clase) indicaba una selección de todos los elementos de la clase “nombre_clase” mientras que una almohadilla seguida de un nombre indica el elemento con el identificador del nombre (#identificador). Estos selectores ya se vieron en la sesión de CSS pero ahora haremos un pequeño repaso ya que con jQuery siempre que deseemos acceder a un elemento del DOM lo haremos siguiendo la sintaxis de estos dentro de la función $(). Por ejemplo para acceder al elemento con id “elemento1” escribiremos esta línea:
$('#elemento1');
Este selector nos devolverá una referencia única al elemento1, en cambio si como selección usamos una clase, jQuery nos devolverá un array con todos los elementos que cumplan el selector CSS (en este caso todos los que tengan el atributo class como “clase1”.
//recogemos todos los elementos de la clase1
var elementos = $('.clase1');
//mostramos contenido Html del primero elemento encontrado de la clase1
alert(elementos[0].innerHtml);
Existen multitud de selectores CSS que podemos usar en nuestros scripts con jQuery, muchos de ellos ya los habéis estudiado en el módulo de Web 2.0. Ahora vamos a repasar los más importantes que nos ayudaran a lo largo de este módulo:
Una vez hemos seleccionado un elemento (o varios de ellos) con un selector CSS podemos ver y modificar sus atributos ayudándonos con los diferentes atajos que nos ofrece jQuery. Estos atajos se usan seguidamente al selector, por ejemplo $('#elemento1').val() devolvería el atributo value. A continuación mostramos un listado de estos atajos y su uso:
Haciendo uso de los selectores y atajos en los atributos vamos a escribir un pequeño ejemplo que intercambia las clases de un elemento modificando su visualización al pasar el ratón sobre un texto.
<html>
<head>
<script src="http://code.jquery.com/jquery.min.js"
type="text/javascript"></script>
<style type="text/css">
.clase_fondo_color{
background-color: #cccccc;
}
</style>
</head>
<body>
<div id="texto">
Un texto cualquiera
</div>
<br>
<span onmouseover="$('#texto').addClass('clase_fondo_color');"
onmouseout="$('#texto').removeClass('clase_fondo_color');">
Cambiar el color de fondo del texto
</span>
</body>
</html>
Además de tener los selectores y métodos de acceso, jQuery dispone de otras funciones y atajos que nos permiten acceder y modificar nuestras página web de forma más sencilla y rápida. Un resumen de ellos sería:
En el siguiente ejemplo modificaremos todos los elementos de una lista pulsando un botón, se usa del método abreviado .each que permite recorrer todos los elementos seleccionados.
<html>
<head>
<style type="text/css">
.clase_fondo_color{
background-color: #cccccc;
}
</style>
<script src="http://code.jquery.com/jquery.min.js"
type="text/javascript"></script>
<script>
function cambiar_elementos()
{
$("li").each(function(){
$(this).toggleClass("clase_fondo_color");
});
}
</script>
</head>
<body>
<button onclick="cambiar_elementos()">
Cambiar todos los elementos de la lista
</button>
<ul>
<li>Primero de la lista</li>
<li>Segundo de la lista</li>
<li>Tercero de la lista</li>
</ul>
</body>
</html>
Hasta ahora para poder trabajar con los eventos típicos como onclick, onmouseenter, onmouseover, etc., utilizábamos la sintaxis típica de Javascript. jQuery permite asociar estos eventos a funciones y elementos concretos gracias al método bind. Esta función se utiliza con la siguiente sintaxis: .bind('tipo_de_evento',function(){}). El objetivo es asociar una función a los elementos seleccionados. Un ejemplo básico sería este:
$('#elemento1').bind('click', function() {
alert('acabas de hacer click');
});
Cabe destacar que la función que es llamada se denomina de tipo callback. Esta funciones se pasan como parámetros de otras, ejecutándose cuando un evento ha ocurrido. A lo largo del curso trataremos varias veces con ellas.
Todos las funciones que se llaman como consecuencia de un evento llevan implícito como parámetro el objeto Event. Normalmente este objeto no se usa y al declarar nuestra función lo omitimos pero algunas veces es necesario. El objeto Event tiene varios atributos y métodos relacionados con el evento que acaba de suceder, entre ellos destacamos:
Un ejemplo básico del uso del objeto Event sería:
$('#elemento1').bind('click', function(event) {
alert('El cursor se encuentra en('
+ event.pageX + ', ' + event.pageY + ')');
});
Existen también otros métodos abreviados que combinan el uso del método bind con los diversos tipos de eventos. Un listado de los más importantes sería esta:
Además de los predeterminados, en jQuery se permite la personalización de efectos mediante la función animate. Esta función nos permite pasar de unas propiedades CSS iniciales en un elemento, a otra finales mediante una animación. La sintaxis es la siguiente:
Elemento.animate({propiedades finales css},velocidad)
A continuación mostramos un ejemplo de como animar un elemento (en este caso un div). La palabra HOLA cambiara de tamaño agrandándose al mismo tiempo que pierde intensidad:
<html>
<head>
<script src="http://code.jquery.com/jquery.min.js"
type="text/javascript"></script>
</head>
<body>
<button id=”iniciar”></button>
<div>HOLA</div>
<script>
$("#iniciar").click(function(){
$("#block").animate({ opacity: 0.5,fontSize: "48px",}, 1500 );
});
<script>
</body>
</html>
Es una de las herramientas mas poderosas de jQuery. Permite al concatenación sucesiva de métodos. Su sintaxis es Elemento.metodo1().metodo2().metodo3()[...]. Cada una de las funciones llamadas hace de callback sobre la de su izquierda. Es muy útil a la hora de manejar eventos y también para mostrar efectos, se puede emplear con cualquier método de jQuery y concatenar tantas funciones como se desee. Por ejemplo podríamos hacer desaparecer y volver aparecer un elemento de la siguiente manera:
$("#elemento1").fadeOut().fadeIn();
jQuery dispone de métodos que nos van a permitir hacer nuestras llamadas AJAX de una manera mucho más sencilla que tratando directamente con el objeto XMLHttp. La función principal que llamaremos para realizar una petición ya sea POST o GET es $.ajax. Seguidamente mostramos un ejemplo de su uso:
$.ajax({ type: "POST",
url: "pagina.php",
data: "id=22&nombre=Luis",success: function(datos){
alert( "Datos devueltos por el servidor: " + datos ); }
});
En este código estamos realizando una petición AJAX de tipo POST ya que podemos advertir como en la opción “data” enviamos al servidor dos variables: id y nombre. Por último, se indica la función que será llamada si la petición ha sido correcta, en este caso se mostrará un alert como la información devuelta por el servidor.
Aunque todas las peticiones AJAX se pueden realizar en jQuery mediante la función $.ajax, existen unos métodos abreviados que nos van a permitir trabajar de manera aún mas rápida. Por ejemplo la función .load(url,data,callback) nos permite hacer una petición AJAX de tipo GET (los parámetros especificados en data se pasaran por GET) y el resultado devuelto sustituirá el código Html del elemento que haya lanzado la función. En el siguiente ejemplo vemos como se sustituirá el texto “AQUI IRAN LOS DATOS DE VUELTA” por la información devuelta por el script de PHP ajaxRequest.php (este script de PHP lo usaremos es los tres siguientes ejemplos, con lo que solo se mostrara una vez).
Código Cliente:
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script>
// cuando este cargado el documento haremos la peticion
$(document).ready(inicio);
function inicio(){
$("#divRespuesta").load("ajaxRequest.php"
,"opcion=load¶metro1=valor1",vuelta);
}
function vuelta()
{
alert("se realizo la conexion");
}
</script>
</head>
<body>
<div id="divRespuesta">AQUI IRAN LOS DATOS DE VUELTA</div>
</body>
</html>
Código servidor:
<?php
switch($_GET["opcion"])
{
case "load":
load();
break;
case "get":
get();
break;
case "post":
post();
break;
}
function load()
{
echo "Se llamo con la funcion load, y se paso el parametro
'parametro1' con valor "
. $_GET["parametro1"];
}
function get()
{
echo "1984";
}
function post()
{
if($_POST["usuario"]==33)
echo "Issac Asimov";
}
?>
Otro de los métodos abreviados es $.get(url,data,callback). Como su nombre indica realizará una petición AJAX de tipo GET, pasando los parámetros especificados en data y al finalizar (si todo ha sido correcto) lanzará la función callback. A diferencia de la función .load, esta no necesita ser lanzada desde un elemento y el valor devuelto por el servidor se enviara como primer parámetro al callback. A continuación se muestra un ejemplo en el que se realizará una petición que devolverá un nombre de libro el cual se indicará en el div con identificador “divRespuesta”.
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script>
// cuando este cargado el documento haremos la peticion
$(document).ready(inicio);
function inicio(){
$.get("ajaxRequest.php","opcion=get",vuelta);
}
function vuelta(response)
{
$("#divRespuesta").append(response);
}
</script>
</head>
<body>
<div id="divRespuesta">El libro de vuelta es: </div>
</body>
</html>
Por último vamos a ver la función $.post(url,data,callback) que es similar $.get() con la salvedad que los datos especificados en data se pasaran por POST. En el siguiente ejemplo el script PHP del servidor nos devolvera el nombre de un usuario y lo mostraremos en el div con identificador “divRespuesta”.
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script>
// cuando este cargado el documento haremos la peticion
$(document).ready(inicio);
function inicio(){
$.post("ajaxRequest.php?opcion=post","usuario=33",vuelta);
}
function vuelta(response)
{
$("#divRespuesta").append(response);
}
</script>
</head>
<body>
<div id="divRespuesta">El nombre del usuario es: </div>
</body>
</html>