http://fisica.ciens.ucv.ve/felix/ajax/
felix@fisica.ciens.ucv.ve
AJAX es una
abreviatura de
Asynchronous
Javascript
And
XML y, básicamente,
consiste en una combinación de diferentes técnicas
que permiten actualizar una página WEB
, o parte de
ella, sin la necesidad de recargar esta.
Las técnicas son,
entre otras, básicamente Javascript,
CSS
( Cascade Style
Sheet: Hoja de Estilos en Cascada ) y el
DOM
( Document Object
Model: Modelo de Objetos del Documento ). Una
característica muy importante de ellas es que son GRATIS. Ud.
no tiene que pagar por ellas, no tiene que "bajar" nada desde
INTERNET
, no tiene que instalar nada: Todo
está contenido en su navegador. En otras palabras, la
diversión es GRATIS:
WEB
.WEB
.
Tal acceso es realizado dinámicamente, por supuesto, con la
ayuda de Javascript.WEB
sin
recarga de ésta y sin perturbar las manipulaciones del usuario.
Agreguemos que es completamente GRATIS.
El lector interesado en profundizar las diversas técnicas puede
consultar la multitud de tutoriales que existen en la
WEB
. Por ejm,
http://www.w3schools.com es un
buen punto de partida.
El lector habrá observado la preponderancia de Javascript en la introducción anterior. En realidad, el objeto básico en la implementación de AJAX es XMLHttpRequest el cual es suministrado por Javascript. Este objeto provee la conexión a un servidor.
Si ignoramos precauciones y similares, el código básico de AJAX sería tan simple como ( cuatro ( 4 ) instrucciones que incluyen un manejador de eventos ):
Conexion=new XMLHttpRequest(); Conexion.open("POST",servidor,true); Conexion.onreadystatechange = function() { if ( Conexion.readyState!=4 ) return; if ( Conexion.status==200 ) { // Aqui tomo las acciones necesarias } else // Posible mensaje de error } Conexion.send(null);
http://www.w3.org/TR/XMLHttpRequest/
Los pasos básicos para establecer y ejecutar una conexión
entre una página WEB
y un programa
que reposa en cierto servidor ( con el propósito de
recibir alguna información que permita actualizar la
página sin hacer una recarga de ella ) son
( estrictamente en ese orden ):
El código:
Conexion=new XMLHttpRequest(); // Establece conexion
asigna a la variable Conexion el objeto retornado de tipo XMLHttpRequest. La presencia de la variable Conexion es necesaria para las manipulaciones posteriores de la conexión. Diversos navegadores requieren inicializaciones especiales de tal manera que una inicialización correcta luce como
Conexion=false; if ( window.XMLHttpRequest ) Conexion=new XMLHttpRequest(); else if ( window.ActiveXObject ) Conexion=new ActiveXObject("Microsoft.XMLHTTP");
El siguiente paso consiste en preparar la conexión a un servidor especificado. Ello se realiza, por ejm, con el siguiente código
Conexion.open("POST",servidor,true); // Prepara la conexion
// Prepara la conexion Servidor="http://www.elServidor.com/temperatura.out"; Conexion.open("POST",Servidor,true);En este caso, temperatura.out es un programa, en el servidor www.elServidor.com, que envía alguna información hacia la página
WEB
que estableció
la conexión.WEB
y el servidor se establece
en forma no sincronizada
( asincrónica ). Ello significa que
la página WEB
no espera por la
respuesta del servidor y el usuario puede continuar trabajando en
ella sin advertir lo que ocurre tras bastidores ( entre la
página WEB
y el servidor).Una vez que se ha establecido y preparado la conexión se establece un manejador de eventos. El código siguiente cumple este papel:
// Establece a la funcion temperatura como el manejador de // eventos: Un evento ocurre "cuando el servidor envia una // respuesta". Conexion.onreadystatechange=temperatura;
En este ejemplo, temperatura es una función que puede ser definida, por ejm, por el siguiente código:
function temperatura() { // En espera del valor 4 ( "respuesta enviada" ) if ( Conexion.readyState!=4 ) return; if ( Conexion.status==200 ) // Si conexion HTTP es buena !!! document.getElementById("t").innerHTML = Conexion.responseText; else document.getElementById("t").innerHTML="No disponible"; }
El servidor envia valores sucesivos de
readyState los cuales son
0, 1,
2, 3
y 4. El valor 4
corresponde al envio satisfactorio de la respuesta. Note que la
función temperatura ignora los
valores menores que 4 y procede a ejecutar
el código de actualización de la página
WEB
cuando el valor
4 ha arribado. Antes de ello se asegura
que la conexión HTTP
es correcta. Ello
corresponde al valor 200 para la variable
status.
La repuesta del servidor es contenida en
Conexion.responseText como texto
ASCII
( digamos texto simple ).
Existen otros formatos que corresponden a la respuesta
recibida pero ello no nos atañe por el momento.
En la función temperatura, es
claro que nuestro ejemplo actualiza la temperatura en una
página WEB
y ello ocurre en cierto
elemento con la id definida por
"t".
Ello se logra con el código:
// Finalmente, solicitamos una respuesta del servidor Conexion.send(null);
El argumento de send se utiliza para enviar datos al servidor. En este caso, el valor null indica que la página no está enviando datos al servidor. En este ejemplo simple, solo esperamos la respuesta del servidor: ¡ La Temperatura Ambiente !.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>AJAX: Temperatura Ambiente</title> <script type="text/javascript"> <!-- Conexion=false; // Variable que manipula la conexion. if ( window.XMLHttpRequest ) Conexion=new XMLHttpRequest(); else if ( window.ActiveXObject ) Conexion=new ActiveXObject("Microsoft.XMLHTTP"); function temperatura() { // En espera del valor 4 ( "respuesta completa" ) if ( Conexion.readyState!=4 ) return; if ( Conexion.status==200 ) // Si conexion HTTP es buena !!! document.getElementById("t").innerHTML = Conexion.responseText; else document.getElementById("t").innerHTML="No disponible"; Conexion=false; } window.onload = function() { if ( Conexion ) { // Preparacion. Servidor="http://www.elServidor.com/temperatura.out"; Conexion.open("POST",Servidor,true); // Manejando eventos. Conexion.onreadystatechange=temperatura; // Solicitud al servidor. Conexion.send(null); } else document.getElementById("t").innerHTML="No disponible"; } //--> </script> </head> <body> Temperatura Ambiente: <span id="t"></span> </body> </html>
Si el procesa resulta exitoso, el resultado en la página
WEB
lucirá como:
donde 300 C, por ejm, es retornado en Conexion.responseText. En caso contrario, luce como
En este ejemplo, el proceso de conexión se inicia tan pronto
como la página WEB
se carga y ocurre, por lo
tanto una sola vez. Pero, supongamos que la temperatura necesita
actualizarse un poco mas tarde a petición del usuario. En
tal caso, es necesario proveer a este de un mecanismo que le permita
realizar a voluntad tal acción. Por ejm, un botón
( button ) es una opción
adecuada. Esto resume el propósito del siguiente ejemplo.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>AJAX: Temperatura Ambiente</title> <script type="text/javascript"> <!-- Conexion=false; // Variable que manipula la conexion. function Conectar() { if ( window.XMLHttpRequest ) Conexion=new XMLHttpRequest(); else if ( window.ActiveXObject ) Conexion=new ActiveXObject("Microsoft.XMLHTTP"); } function Solicitud() { if ( Conexion ) return; // Previene uso repetido del boton. Conectar(); if ( Conexion ) { // Preparacion. var servidor="http://www.elServidor.com/temperatura.out"; Conexion.open("POST",servidor,true); // Manejando eventos. Conexion.onreadystatechange=temperatura; // Solicitud al servidor. Conexion.send(null); } } function temperatura() { // En espera del valor 4 ( "respuesta completa" ) if ( Conexion.readyState!=4 ) return; if ( Conexion.status==200 ) // Si conexion HTTP es buena !!! document.getElementById("t").innerHTML = Conexion.responseText; Conexion=false; } window.onload = function() { Solicitud(); // Inicializa la temperatura al cargar la pagina. /* Manejador de eventos "click" para el boton de actualizacion */ document.getElementById("boton").onclick=Solicitud; } //--> </script> </head> <body> Temperatura Ambiente: <span id="t">No disponible</span> <input type="button" id="boton" value="actualizar" /> </body> </html>
Si el procesa resulta exitoso, el resultado en la página
WEB
lucirá como:
donde 300 C, por ejm, es retornado en Conexion.responseText o corresponde a la penúltima actualización. En caso contrario, luce como
Hasta ahora solo nos hemos propuesto mostrar un ejemplo simple en la forma mas rápida posible con el propósito de mostrar al usuario la simplicidad del tema AJAX. Hemos obviado muchos detalles los cuales son asociados al objeto XMLHttpRequest. Tales "detalles" pueden ser clasificados como:
WEB
no
es interferida en su funcionamiento por la
respuesta del servidor. El usuario puede
continuar usando la página mientras el
servidor retorna una respuesta que
la actualizará, usualmente, en
forma parcial.0 ( No inicializado ): | Es el valor inicial de readyState. |
1 ( Abierto ): | El método open ha tenido éxito. |
2 ( Enviado ): | Se ha completado la solicitud pero ningun dato ha sido recibido todavía. |
3 ( Recibiendo ): | Antes de recibir un mensaje
body ( en caso que
exista ). Todas las cabeceras
( headers )
HTTP han sido recibidas. |
4 ( Respuesta Completa ): | Todos los datos han sido recibidos. |
HTTP
de la
conexión con el servidor.
200 es el valor para una
conexión exitosa. status
debe estar disponible cuando
readyState toma los
valores 3
o 4.HTTP
enviado por
el servidor y es accesible despues de la
aparición de
status.World Wide
Web
Consortium.INTERNET
.
Entre otros, ver:
pdf
) por Frank W. Zammetti.