¿Qué es Ajax? Ajax (Asynchronous JavaScript And XML)AJAX (Asynchronous JavaScript And XML), no es una nueva tecnología como algunos dicen, es un conjunto de tecnologías, una técnica de desarrollo web que une JS y XML o HTML de manera asicrónica.
A lo que estamos acostumbrados es, por ejemplo, al llenar un form, lo envías y te manda a la página de procesamiento que te da resultado, con AJAX usas procesos en background, que gasta menos ancho de banda, es mas rápido y mas eficiente, los procesos HTTP requeridos se sustituyen con un motor AJAX escrito en JS, no carga lo mismo dos veces lo cual resulta práctico, miren:
Si observas a Gmail, usa AJAX o Google Maps, yo pensé que era mas difícil pero no, si sabes un poco de JS, lo manejas mas o menos en poco tiempo.
//Iniciamos Objeto XMLHttp
function get_xmlhttp() {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp
}
//Funcion de envio kon la palabra reservada open, indicamos objeto, metodo (en este caso GET) la url, variables y una respuesta
function enviar(xmlhttp,metodo,url,async,callback) {
xmlhttp.open(metodo, url,async);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) { //readyState retorna 4 al terminar la operacion
callback(xmlhttp) //Retorna resultado
}
}
xmlhttp.send(null)
}
function prueba_XMLHttpRequest() {
xmlhttp=get_xmlhttp() //Iniciamos proceso
var valor=document.getElementById("valor").value //Declaramos variables de uso
enviar(xmlhttp,"GET","ajax_marioly.php?valor="+encodeURIComponent(valor),true,recibirRespuesta); //Usamos la funcion de envio
}
function recibirRespuesta(xmlhttp) {
val=""
for(i in xmlhttp) {
try {
val+="xmlhttp."+i+"="+xmlhttp[i]+"\n"
} catch(e) {}
}
if(xmlhttp.status==404) { //404 si la pagina no se encuesta , 200 si esta todo bien, retorna OK
alert("Esta pagina no existe")
}
//Retornos
document.getElementById("cabecera").innerHTML=xmlhttp.getAllResponseHeaders();
document.getElementById("texto").innerHTML=xmlhttp.responseText
document.getElementById("estatus").innerHTML=xmlhttp.status
document.getElementById("objeto").innerHTML=val
}
Ajax sirve para petición y recepción de datos en procesos background usando SOAP, para hacer posible las peticiones web usaremos el objeto XMLHTTPRequest que es implementado en todos los navegadores, pero como siempre ahí diferencias en los browsers, esta vez es en la creación del objeto, IE usa ActiveX para crearlo y los demás no, así que tendremos que usar algo como lo que yo uso:
function get_xmlhttp() {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp
}
Tratamos inicializarlo con ActiveXObject kon try y catch y si aun es nulo, lo creamos con XMLHttpRequest() , todo esto está en nuestra función get_xmlhttp , que podemos usar cuando necesitemos un request ( var = get_htmlhttp(); ).
Los metodos de un objeto XMLHttpRequest son:
- abort(): Aborta la petición actual.
- getAllResponseHeaders(): Devuelve todas las cabeceras (etiquetas y valores) como un string.
- getResponseHeader("headerLabel"): Devuelve el valor de la cabecera etiquetada como headerLabel.
- open("method", "URL"[, asyncFlag[, "userName"[, "password"]]]): Abre una conexión a una URL, con un método HTTP (get o post), y otros parámetros opcionales.
- send(content): Envía la petición. Suele ser un String o un objeto DOM
- setRequestHeader("label", "value"): Crea un par etiqueta/valor para ser enviado en la cabecera de la petición.
Las Propiedades son:
- onreadystatechange: Guarda el nombre de la función Javascript que manejará los cambios de estado en la petición.
- readyState: Entero que codifica el estado actual de la petición:
0 = No Inicializado
1 = Cargando
2 = Cargado
3 = Interactuando
4 = Completado - responseText: Versión en forma de String de los datos devueltos por el servidor.
- responseXML: Objeto DOM compatible de la respuesta del servidor.
- status: Código de estado devuelto por el servidor, como 404 para No encontrado o 200 para Ok.
- statusText: Mensaje que acompaña al código de estado.
Al cliquear en botón de envío ejecuta un script con el evento onClick() de js, este:
function prueba_XMLHttpRequest() {
xmlhttp=get_xmlhttp()
var valor=document.getElementById("valor").value
xmlhttp.open("GET", "ajax_marioly.php?valor="+encodeURIComponent(valor),true);
if (xmlhttp.readyState==4) {
if(xmlhttp.status==404) {
alert("Esta pagina no existe")
}
//Retornos
document.getElementById("cabecera").innerHTML=xmlhttp.getAllResponseHeaders();
document.getElementById("texto").innerHTML=xmlhttp.responseText
document.getElementById("estatus").innerHTML=xmlhttp.status
}
xmlhttp.send(null)
}
Lo explicaré por partes:
xmlhttp=get_xmlhttp()
var valor=document.getElementById("valor").value
xmlhttp.open("GET", "pagina.php?valor="+encodeURIComponent(valor),true);
Primero creamos nuestro objeto xmlhttprequest con la función que creamos antes ( get_xmlhttp() ), en la segunda línea declaramos una variable que usaremos (valor) kon la palabra reservada de javascript var el valor lo obtendremos de un input con el id "valor" con getElementById de jscript (no solo se puede obtener por id) si ven el source de la web, el input donde escribes es algo así:
<input type="text" id="valor" />
Después usaremos el método open para crear una conexión a una URL especifica por método GET y en este caso, pasaremos nuestra variable por la url dándole valor a la variable "valor", que esa variable será la que imprima el script al enviar, pero codificado con encodeUriComponent este método lo que hace es:
Codifica una cadena de texto como un componente válido de un identificador de recursos universal (URI, Uniform Resource Identifier).
Al final de la cadena escribí un true, eso especifica si es asincrónico (true), sincronico (false) , que si ponemos false (sincrónico), pierde lo bueno que tiene el ajax , por eso por default está en true.
Segunda parte:
if (xmlhttp.readyState==4) {
if(xmlhttp.status==404) {
alert("Esta pagina no existe")
}
//Retornos
document.getElementById("cabecera").innerHTML=xmlhttp.getAllResponseHeaders();
document.getElementById("texto").innerHTML=xmlhttp.responseText
document.getElementById("estatus").innerHTML=xmlhttp.status
}
xmlhttp.send(null)
}
Primero con una sentencia de control y el objeto ReadyState verificamos si el estado actual es 4 (Completado), si es así proseguimos, verificamos ahora el estatus si es 404 (pagina no encontrada) lanzamos un alert de error, si no es así, ya damos los retornos en campos especificados, voy a explicar solo uno bien:
document.getElementById("cabecera").innerHTML=xmlhttp.getAllResponseHeaders();
usamos innerHTML para escribir dentro de una capa, en este caso dentro de la capa "cabecera", escribimos el resultado del objeto getAllResponseHeaders(), que retorna las cabeceras de nuestro envío, aquí devolvería algo como:
Date: Wed, 02 Nov 2005 22:47:20 GMT
Server: Apache/1.3.33 (Unix) mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 PHP/4.4.0 FrontPage/5.0.2.2635 mod_ssl/2.8.22 OpenSSL/0.9.7a
X-Powered-By: PHP/4.4.0
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
responseText devolveria el texto recibido por que en nuestro script, como dije arriba, imprime la variable "valor" recibida por GET que fue el metodo que utilizamos y status devolveria el status actual que seria 200 (OK), por último , con el objeto send enviamos valor nulo por que no tenemos nada que enviar esta ves asi que lo dejamos vacio, el método de envío si lo hubiese , sería como pasar variables por una url concatenándolas:
xmlhttp.send("valor="+valor+"&valor2="+valor2)
Consejos para Ajax:
- Cuida de no repetir campos con el mismo id o si lo haces que nunca estén en pantalla al mismo tiempo por que dara error.
- Usa codificacion charset=utf-8 o empezaras a odiar el => �? ±
- Nunca dejes capas sin cerrar o en js variables sin declarar, sigue estandares xml y para javascript puedes usar la consola js de Mozilla Firefox que a mi me resulto bastante útil
- Ya que el source Js puede ser visto, pon enfasis en la seguridad de tus scripts de procesamiento.
Fuente: CodigosWeb.Net