Documente Academic
Documente Profesional
Documente Cultură
Concepto de AJAX
Cargar y renderizar una página, luego mantenerse en esa página mientras scripts y rutinas van al servidor
buscando, en background los datos que son usados para actualizar la página solo re-renderizando la
página y mostrando u ocultando porciones de la misma.
AJAX, en resumen, es el acrónimo para Asynchronous JavaScript+CSS+DOM+XMLHttpRequest
Que NO ES Ajax
Por ejemplo en un proceso normal una aplicación web recarga o va de una página a otra porque debe
enviar una petición a algún servidor web esta debe procesarla y mandar el resultado final y el resultado
final es la página a la cual nos dirige la aplicación o la recarga de la página misma. En todo esto AJAX
hace lo mismo con la diferencia que lo hace en background ósea que realiza todo el proceso de
comunicación con algún servidor web sin que el usuario pueda verlo y una vez terminada con éxito solo
añadir el resultado del proceso a la página en curso de esta manera evitar la recarga o una página
receptora de los resultados del proceso.
Entiendase que AJAX no se refiere a usar el objeto XMLHttpRequest de manera indispensable porque en
realidad AJAX no es una tecnología, sino la unión de varias tecnologías que juntas pueden lograr cosas
realmente impresionantes como GoogleMaps, Gmail,etc.
* Javascript Remote Scripting (JSRS): Un cliente javascript que ejecuta procesos en background
escondiendo elementos, iframes,etc no usa el objeto XMLhttprequest
* Microsoft's Remote Scripting (MSRS): solves this problem by embedding a Java applet in the page to
communicate with the server. It provides synchronous and asynchronous remote procedure calls, and
works with Netscape 4.x and IE 4+ only on Windows platforms. Because it requires Java, it only works with
Windows XP if the optional JVM is loaded. It is designed to work with IIS/ASP on the server side. MSRS is
in wide use, mostly on corporate intranets where the client base is predictable. Microsoft has made MSRS
freely available.
* Internet Explorer:download Behavior: Ofrece una implementación muy similar de lo que hace JSRS. Si
van a trabajar exclusivamente con Internet Explorer y no quieren complicarse la vida con XML y esas
cosas, pueden echarle una miradita.
* Webservice Behaviour: Si se quieren complicar un poco más la vida, si les piden que se contacten con
un servicio web en SOAP desde IE, pueden usar el comportamiento Webservice.
* XML-RPC: Una especificación para usar XML y HTTP para hacer RPC. Si bien tiene una impresionante
lista de implementaciones en distintos lenguajes, lo verboso del XML hace que la más simple llamada
ocupe un monto alto de ancho de banda y el control de errores que posee es bastante malo. Lo utilice
para hacer RPC entre dos servidores con PHP y funcionó, de todos modos, relativamente bien. No lo
recomendaría si del lado del cliente utilizan sólo Js.
* RSLite is an extremely lightweight implementation of remote scripting which uses cookies. It is very
widely browser-compatible (Opera!) but limited to single calls and small amounts of data. It is also free.
El objeto XMLHttpRequest
Como vamos a trabajar con este objeto nativo es indispensable crearlo caso contrario ni se podrá
comenzar las aplicaciones, partiremos con el objeto desde la creación, Métodos y propiedades.
* Métodos
A continuación los métodos del objeto.
* Propiedades
A continuación las propiedades del objeto.
o onreadystatechange : Contiene el nombre de la función que se ejecuta cada vez que el estado de la
conexión cambie.
o readyState : Estado de la conexión.
Código Estado
1 Cargando
2 Cargado, pero sin su contenido incorporado a los objetos correspondientes
3 Incorporando a los objetos correspondientes
4 Carga completada
Código Valor
200 Completado con éxito
404 No se encontró URL
414 Los valores pasados por GET superan los 512 bytes
o statusText : Mensaje de texto enviado por el servidor junto al código (status), para el caso de código 200
contendrá "OK".
El proceso Cliente-Servidor
Cuando nuestro cliente se comunica con el servidor este no recibirá variables para su uso, modificación.
Nuestro objeto XMLHttpRequest al invocarlo y pedir datos a un servidor lo que recibe es LO QUE EL
SERVIDOR SUELTA, me explico:
<?php <?php
if(isset($_GET['valor']))
{
$_valor=$_GET['valor'];
if($_valor==1)
{
echo "Enviaste el valor 1";
}
elseif ($_valor==2)
{
echo "Enviaste el valor 2";
}
else
{
echo "No enviaste ningun valor ACEPTABLE";
}
}
else
{
echo "No se a enviado valor alguno de peticion";
}
?>
Enviaste el valor 1
Enviaste el valor 2
Entonces lo que debemos hacer es que nuestros archivos Cliente entiendan la línea y la manera de
procesas las peticiones que tendrá nuestro servidor.
Eso sí, al realizar la petición al servidor se pueden crear variables de sesión, cookies, consultas SQL, etc
etc.
Ósea..... si me refiero a cliente me refiero al archivo cliente.php y si digo "... entonces nuestro procesador
nos mandará...." me refiero al archivo procesador.php.
Como primer ejemplo no haremos el típico HOLA MUNDO enviaremos una petición a nuestro procesador
que nos arrojará nuestro IP,REQUEST_URI,date() usando el método GET.
Ejemplo 1
Cliente
Nuestro procesador trabajará según la variable funcion que reciba por el método GET
<?php <?php
if(isset($_GET['funcion']))
{
$_valor=$_GET['funcion'];
if($_valor=="pt")
{
$_pt="Tu ip: ".htmlspecialchars($_SERVER['REMOTE_ADDR'])."\n";
$_pt.="request_uri: ".htmlspecialchars($_SERVER['REQUEST_URI'])."\n";
$_pt.="date(): ".htmlspecialchars(date("d-m-Y : H-i-s"))."\n";
echo $_pt;
}
else
{
echo "No enviaste ningun valor ACEPTABLE";
}
}
else
{
echo "No se a enviado valor alguno de peticion";
}
?>
Ejecutar ejemplo1:
<?php _objetus=objetus()
Llamamos al objeto XMLHttpRequest
<?php _values_send="funcion=pt"
<?php _URL_="proceso.php?"
<?php _objetus.open("GET",_URL_+"&"+_values_send,true);
La parte más importante, aqui abrimos la URL con los valores cargados ósea proceso.php?funcion=pt
<?php _objetus.onreadystatechange=function() {
Invocamos la propiedad onreadystatechange, entonces cuando el objeto llegue a este punto se llamará a
una funcion que gestionará el resto del proceso.
<?php if (_objetus.readyState==4)
{
Llamamos ahora a la propiedad readyState que nos indicará en que estado se encuentra el proceso,
entonces cuando el estado sea 4 (Terminado) hacemos LO QUE SE NOS OCURRA.
<?php if(_objetus.status==200)
{
Si el estado del proceso arroja un status 200 significa que a terminado con éxito.
<?php window.alert(_objetus.responseText);
En este caso llamamos a la propiedad responseText que tiene lo que el procesador soltó y lo mostramos
mediante un alert.
<?php }
}
}
_objetus.send(null);
}
Y por ultimo enviamos null porque hemos enviado todas las variables que nos interesaban
automáticamente al abrir
proceso.php?funcion=pt
Hay dos maneras en las que se puede recibir la informacion devuelta por el procesador, las propiedades:
responseText y responseXML
# responseText: Con esta propiedad se reciben los datos de la siguiente manera. Cuando el estado del
proceso esté en el nivel 4
<?php vari=objetus.responseText
<?php window.alert(vari)
Esto es lo que usamos en nuestro primer ejemplo, aqui cuando el proceso llega a nivel 4 creamos un alert
con los datos que nos a enviado el procesador.
# responseXML:
Con esta propiedad el procesador nos devuelve los datos como XML y debemos recorrerlo mediante las
funciones del DOM (getEementsByTagName, etc).
<?php vari=objetus.responseXML
Guardamos el documento devuelto en la variable vari para luego recorrerla, en el caso para nuestro
ejemplo el documento XML del procesador tendrá la siguiente estructura:
<serv>
<ip>ip</ip>
<uri>uri </uri>
<date>date</date>
</serv>
Entonces mostraremos:
<?php window.alert(_ip+"\n"+_uri+"\n"+_date)
Ejemplo 1-b
cliente
}
_objetus.send(null);
return
}
</script>
<input type="button" value="con rexponseText" onclick="primer_tope();"><br>
<input type="button" value="con rexponseXML" onclick="primer_topeXML();">
procesador
<?php <?php
if(isset($_GET['funcion']))
{
$_valor=$_GET['funcion'];
if($_valor=="pt")
{
$_pt="Tu ip: ".$_SERVER['REMOTE_ADDR']."\n";
$_pt.="request_uri:";
$_pt.=htmlspecialchars($_SERVER['REQUEST_URI'])."\n";
$_pt.="date(): ".date("d-m-Y : H-i-s")."\n";
echo $_pt;
}
elseif ($_valor=="ptxml")
{
$_xml="<?xml version=\"1.0\" standalone=\"yes\"?>\n";
$_xml.="<serv>\n";
$_xml.="<ip>Tu ip: ".$_SERVER['REMOTE_ADDR']."</ip>\n";
$_xml.="<uri>request_uri:";
$_xml.=htmlspecialchars($_SERVER['REQUEST_URI']);
$_xml.="</uri>\n";
$_xml.="<date>".date("d-m-Y : H-i-s")."</date>\n";
$_xml.="</serv>\n";
//mandamemos cabeceras identificando al documento
//como un documento XML
header('Content-Type: text/xml');
echo $_xml;
}
else
{
echo "No enviaste ningun valor ACEPTABLE";
}
}
else
{
echo "No se a enviado valor alguno de peticion";
}
?>
Re-renderizando elementos
Hasta ahora hemos manejado los datos que nos llegaban del procesador viéndolos con un alert
(window.alert(respuesta)) pues bien ahora vamos a "embeder" los resultados en nuestras páginas,
tenemos 2 maneras de llamar al elemento donde se pondrá el nuevo contenido:
Entonces mostraremos:
<?php window.alert(_ip+"\n"+_uri+"\n"+_date)
Ejemplo 1-b
cliente
<?php target="nombreid";
document.getElementById(target).innerHTML = _objetus.responseText;
No tengo una idea clara a como llamar por su tag name, por favor pido la ayuda de alguien que sepa esto
Ejemplo 2
Solo cambiará nuestro cliente.
<?php <script language="javascript" type="text/javascript">
# funcion encarga de crear el objeto
function objetus() {
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
}
función primer_tope()
{
_objetus=objetus()
_values_send="funcion=pt"
_URL_="procesador.php?"
_objetus.open("GET",_URL_+"&"+_values_send,true);
_objetus.onreadystatechange=function() {
if (_objetus.readyState==4)
{
if(_objetus.status==200)
{
target="nuestrodiv_id"
document.getElementById(target).innerHTML=_objetus.responseText;
}
}
}
_objetus.send(null);
return
}
</script>
<input type="button" name="visual" value="Pedir" onclick="primer_tope();">
<!-- aqui se carga el resultado -->
<div id="nuestrodiv_id"></div>