curso de ajax - ajaxya

Upload: hugo-cristhian-aguilar-guillen

Post on 30-Oct-2015

75 views

Category:

Documents


0 download

TRANSCRIPT

Ajax Ya desde CEROAJAXAjax Ya desde CEROEl objetivo de este tutorial es poder aprender Ajax viendo un concepto terico, luego algunos ejercicios resueltos y otros por resolver.Puede desarrollar los ejercicios en el sitio, probarlos, modificarlos y ver los resultados inmediatamente.A lo largo del curso se introducen conceptos de Ajax desde CERO, si esta olvidado de HTML, JavaScript, CSS, PHP o DHTML puede visitar HTML Ya, JavaScript Ya, CSS Ya, PHP Ya y DHTML Ya 1 - Qu es AJAX?2 - Ventajas y desventajas de AJAX.3 - Un ejemplo con AJAX.4 - El mismo ejemplo sin AJAX.5 - Objeto XMLHttpRequest6 - Pasando datos al servidor por el mtodo GET.7 - Pasando datos al servidor por el mtodo POST.8 - Recuperando datos mediante la propiedad responseText del objeto XMLHttpRequest9 - Recuperando datos mediante la propiedad responseXML del objeto XMLHttpRequest10 - Propiedades onreadystatechange y readystate.11 - Propiedades status y statusText.12 - Mtodo abort del objeto XMLHttpRequest13 - Mostrar un gif animado mientras se envan y reciben los datos del servidor.14 - Paginacin con AJAX15 - Cargar un control de tipo select16 - Mostrar un tooltip con datos recuperados del servidor en forma asincrnica17 - Autocompletar un control de tipo text18 - Encuenta con AJAX19 - Qu es JSON?20 - Recuperar datos del servidor en formato JSON21 - De PHP a JSON (utilizando la librera JSON.php)22 - De JavaScript a JSON (utilizando la librera json.js)23 - De JSON a JavaScript (utilizando la librera json.js)24 - De JSON a PHP (utilizando la librera JSON.php)25 - Pizarra interactiva multiusuario1 - Qu es AJAX?AJAX son las siglas de Asynchronous JavaScript And XML. No es un lenguaje de programacin sino un conjunto de tecnologas (HTML-JavaScript-CSS-DHTML-PHP/ASP.NET/JSP-XML) que nos permiten hacer pginas de internet ms interactivas.La caracterstica fundamental de AJAX es permitir actualizar parte de una pgina con informacin que se encuentra en el servidor sin tener que refrescar completamente la pgina. De modo similar podemos enviar informacin al servidor.La complejidad se encuentra en que debemos domininar varias tecnologas:HTML o XHTMLCSSJavaScriptDHTML Bsicamente debemos dominar todos los objetos que proporciona el DOM.XML Para el envo y recepcin de los datos entre el cliente y el servidor.PHP o algn otro lenguaje que se ejecute en el servidor (ASP.Net/JSP)En este curso suponemos que domina las tecnologas mencionadas, en caso de no ser as recomiendo recorrer los cursos de HTML Ya, JavaScript Ya, CSS Ya, PHP Ya y DHTML Ya, luego todo lo nuevo que aparezca lo hiremos explicando lentamente a travs de ejemplos.2 - Ventajas y desventajas de AJAX.Ventajas: Utiliza tecnologas ya existentes. Soportada por la mayora de los navegadores modernos. Interactividad. El usuario no tiene que esperar hasta que llegen los datos del servidor. Portabilidad (no requiere plug-in como Flash y Applet de Java) Mayor velocidad, esto debido que no hay que retornar toda la pgina nuevamente. La pgina se asemeja a una aplicacin de escritorio.Desventajas: Se pierde el concepto de volver a la pgina anterior. Si se guarda en favoritos no necesariamente al visitar nuevamente el sitio se ubique donde nos encontrabamos al grabarla. La existencia de pginas con AJAX y otras sin esta tecnologa hace que el usuario se desoriente. Problemas con navegadores antiguos que no implementan esta tecnologa. No funciona si el usuario tiene desactivado el JavaScript en su navegador. Requiere programadores que conozcan todas las tecnologas que intervienen en AJAX. Dependiendo de la carga del servidor podemos experimentar tiempos tardos de respuesta que desconciertan al visitante.3 - Un ejemplo con AJAX.Confeccionaremos un ejemplo donde veremos que aparecen muchos conceptos, no se preocupe si no los comprende en su totalidad ya que los mismos se vern en forma detallada a lo largo de este curso.La idea fundamental de este ejercicio es conocer como debemos estructurar nuestras pginas y ver que introduce de nuevo el empleo de AJAX.Confeccionaremos un problema muy sencillo, imaginemos que tenemos una lista de hipervnculos con los distintos signos del horscopo y queremos que al ser presionado no recargue la pgina completa sino que se enve una peticin al servidor y el mismo retorne la informacin de dicho signo, luego se actualice solo el contenido de un div del archivo HTML.Este problema se puede resolver muy fcilmente si refrescamos la pgina completamente al presionar el hipervnculo, pero nuestro objetivo es actualizar una pequea parte de la pgina y ms precisamente el div que debe mostrar los datos del signo seleccionado.Si bien nuestra pgina solo contendr los hipervnculos a los distintos signos en un caso real la pgina puede contener muchos otros elementos HTML con imgenes, otros hipervnculos etc. los cuales no debern sufrir cambios (ni parpadeo) ya que solo se modificar el elemento div respectivo mediante DHTML.Esta actualizacin parcial de la pgina tiene muchas ventajas:Reducimos el ancho de banda requerido al no tener que recuperar toda la pgina.Agilizamos la actualizacin de la pgina.Reducimos el parpadeo de la pgina.Hacemos ms natural la navegacin del sitio.La mayora de los problemas requieren los siguientes archivos como mnimo:El archivo HTML (es la pgina que se ve en el navegador)El archivo JS (contiene todas las rutinas JavaScript que permiten actualizar dinmicamente la pgina HTML (mediante DHTML) y las rutinas que permiten comunicarse con el servidor para el envo y recepcin de informacin.La hoja de estilo, es decir el archivo CSSLa pgina que contiene el script que se ejecuta en el servidor(en nuestro caso emplearemos el lenguaje PHP)Comencemos a presentar los distintos archivos para resolver este problema:pagina1.html

Problema

Signos del horscopo.

AriesTauroGeminisCancerLeoVirgoLibraEscorpioSagitarioCapricornioAcuarioPiscis

Seleccione su signo.

Esta pgina contiene HTML puro. Es importante notar que debemos incorporar los dos archivos externos .css y .js mediante los elementos HTML respectivos:

La hoja de estilo solo tiene el objetivo de mejorar la presentacin en la pgina de los doce hipervnculos de los signos del horscopo. Puede probar de eliminar el archivo .css mediante el borrado del elemento link del archivo HTML y el problema debera continuar funcionando, por supuesto con una presentacin mucho ms pobre.Podemos observar que cada hipervnculo solicita la misma pgina al servidor pero pasndole como parmetro un valor distinto, con esto podremos detectar en el servidor que signo a elegido el operador.El segundo archivo contiene las reglas de estilo que se definen para el archivo HTML:estilos.css#menu { font-family: Arial; margin:5px;}

#menu p { margin:0px; padding:0px;}

#menu a { display: block; padding: 3px; width: 160px; background-color: #f7f8e8; border-bottom: 1px solid #eee; text-align:center;}

#menu a:link, #menu a:visited { color: #f00; text-decoration: none;}

#menu a:hover { background-color: #369; color: #fff;}

#detalles { background-color:#ffc; text-align:left; font-family:verdana; border-width:0; padding:5px; border: 1px dotted #fa0; margin:5px;}No haremos un anlisis de estas reglas ya que corresponden al tema 28 del curso de CSS Ya "Creacin de un men vertical configurando las pseudoclases", puede refrescar los conceptos all. Inclusive si todava conoce poco de CSS y no quiere estudiarlo por ahora puede anular el archivo no incorporndolo en la pgina HTML suprimiento el elemento link.

Ahora viene uno de los puntos claves donde debemos prestar ms atencin, esto se encuentra en las rutinas JavaScript que debemos implementar para comunicarnos con el servidor, adems de lo ya conocido de DHTML para aadir elementos HTML en forma dinmica.Veamos el archivo en su totalidad y expliquemos en forma muy global (recuerde que a lo largo de este curso iremos profundizando todos estos conceptos de comunicacin con el servidor):funciones.jsaddEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ob; for(f=1;fMediante el vector asociativo $_REQUEST recuperamos el valor del parmetro cod y mediante una serie de if verificamos si almacena el valor 1 procedemos a generar un texto referente al signo Aries, si tiene un 2 generamos un texto referente al signo Tauro y as sucesivamente.Hay que tener en cuenta que no se estar enviando una pgina HTML completa, por eso no tiene los elementos Head, Body etc. sino es ms bien un archivo de texto que luego ser aadido en forma dinmica al div de la pgina HTML.Debe quedar claro que los datos se podran haber rescatado perfectamente de una base de datos, pero por simplicidad hemos dispuesto estos 12 if y generado el texto respectivo. Veremos ms adelante problemas que acceden a bases de datos.

Hasta ac el primer problema de AJAX. Le recomiendo pasar a la seccin de "Problemas Resueltos" y ejecutar este ejercicio, releer nuevamente estos conceptos y tratar de hacer modificaciones sencillas al problema.4 - El mismo ejemplo sin AJAX.Volveremos a confeccionar el mismo problema que muestra una lista de hipervnculos con los distintos signos del horscopo, a diferencia del problema expuesta en el concepto anterior ahora no emplearemos AJAX, es decir recargaremos la pgina completamente al presionar alguno de los hipervnculos.Como debemos recargar la pgina y actualizar en el servidor los datos del signo del horscopo seleccionado confeccionaremos solo una pgina php.pagina1.php

Problema

Signos del horscopo.

AriesTauroGeminisCancerLeoVirgoLibraEscorpioSagitarioCapricornioAcuarioPiscis

Como podemos observar los hipervnculos llaman a la misma pgina:href="pagina1.php?cod=1">AriesLuego el cdigo PHP que se ejecuta en el servidor verifica el valor que llega como parmetro y muestra el detalle del signo del horscopo seleccionado:if ($_REQUEST['cod']==1) echo "Aries: Hoy los cambios sern fsicos, personales, de carcter, Te sentirs impulsivo y tomars iniciativas. Perodo en donde considerars unirte a agrupaciones de beneficencia, o de ayuda a los dems.";En caso de no llegar parmetros a la pgina (normalmente la primer vez que cargamos la pgina) el primer if se verifica verdadero:if (!isset($_REQUEST['cod'])) echo "Seleccione su signo.";Si comparamos este ejemplo con el anterior veremos que utilizar AJAX reduce la cantidad de informacin que pedimos al servidor, tambin evitamos la recarga completa de la pgina (imaginemos un sitio que contiene muchos elementos el redibujado es lento y engorroso)La hoja de estilo no tiene cambios con respecto al problema anterior:#menu { font-family: Arial; margin:5px;}

#menu p { margin:0px; padding:0px;}

#menu a { display: block; padding: 3px; width: 160px; background-color: #f7f8e8; border-bottom: 1px solid #eee; text-align:center;}

#menu a:link, #menu a:visited { color: #f00; text-decoration: none;}

#menu a:hover { background-color: #369; color: #fff;}

#detalles { background-color:#ffc; text-align:left; font-family:verdana; border-width:0; padding:5px; border: 1px dotted #fa0; margin:5px;}5 - Objeto XMLHttpRequestEl objeto XMLHttpRequest es un elemento fundamental para la comunicacin asincrnica con el servidor. Este objeto nos permite enviar y recibir informacin en formato XML y en general en cualquier formato (como vimos en el ejercicio anterior retornando un trozo de archivo HTML)La creacin de un objeto de esta clase vara si se trata del Internet Explorer de Microsoft, ya que este no lo incorpora en JavaScript sino que se trata de una ActiveX: if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");En cambio en FireFox y otros navegadores lo incorpora JavaScript y procedemos para su creacin de la siguiente manera: if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest();Como hemos visto en el problema anterior siempre implementaremos una funcin que nos retorne un objeto XMLHttpRequest haciendo transparente el proceso en cuanto a navegador donde se est ejecutando:function crearXMLHttpRequest() { var xmlHttp=null; if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest(); return xmlHttp;}Es decir la funcin crearXMLHttpRequest se encargar de retornarnos un objeto de la clase XMLHttpRequest.Las propiedades principales del objeto XMLHttpRequest son:onreadystatechange Almacena el nombre de la funcin que se ejecutar cuando el objeto XMLHttpRequest cambie de estado.readyState Almacena el estado del requerimiento hecho al servidor, pudiendo ser:0 No inicializado (el mtodo open no a sido llamado)1 Cargando (se llam al mtodo open)2 Cargado (se llam al mtodo send y ya tenemos la cabecera de la peticin HTTP y el status)3 Interactivo (la propiedad responseText tiene datos parciales)4 Completado (la propiedad responseText tiene todos los datos pedidos al servidor)responseText Almacena el string devuelto por el servidor, luego de haber hecho una peticin.responseXML Similar a la anterior (responseText) con la diferencia que el string devuelto por el servidor se encuentra en formato XML.Los mtodos principales del objeto XMLHttpRequest son:open Abre un requerimiento HTTP al servidor.send Enva el requerimiento al servidor.Confeccionaremos otro problema para fijar conceptos vistos hasta el momento.Confeccionar una pgina que muestre una imagen y permita calificarla con un valor entre 1 y 10. Permitir ingresar el nombre del visitante. Disponer de un control de tipo select para seleccionar el valor. Luego al presionar un botn enviar el valor seleccionado utilizando el objeto XMLHttpRequest al servidor donde almacenaremos en un archivo de texto el nombre del visitante y el puntaje. Retornar luego todos los votos hasta el momento. Actualizaremos la pgina HTML con todos los nombres y votos hasta el momento.El archivo HTML es:pagina1.html

Problema

Vote esta foto

Nombre:
Voto:seleccione12345678910

Lo primero que podemos observar es que no utilizaremos una hoja de estilo para reducir la complejidad del problema y concentrarnos en la lgica.Si vemos utilizamos controles de tipo input, select y button, pero no disponemos ningn formulario. Esto se debe a que los datos ingresados se enviarn en forma asncrona mediante el objeto XMLHttpRequest.Otro punto a destacar que a cada control le definimos la propiedad id, esta es de suma importancia para poder accederla desde JavaScript. No definimos la propiedad name ya que no se enviarn los datos por medio de formulario.Nuestro archivo con las funciones JavaScript es:funciones.jsaddEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ob=document.getElementById('boton1'); addEvent(ob,'click',presionBoton,false);}

function presionBoton(e){ var ob1=document.getElementById('voto'); var ob2=document.getElementById('nombre'); cargarVoto(ob1.value,ob2.value);}

var conexion1;function cargarVoto(voto,nom) { conexion1=crearXMLHttpRequest(); conexion1.onreadystatechange = procesarEventos; conexion1.open('GET','pagina1.php?puntaje='+voto+'&nombre='+nom, true); conexion1.send(null);}

function procesarEventos(){ var resultados = document.getElementById("resultados"); if(conexion1.readyState == 4) { resultados.innerHTML = conexion1.responseText; } else { resultados.innerHTML = 'Cargando...'; }}

//***************************************//Funciones comunes a todos los problemas//***************************************function addEvent(elemento,nomevento,funcion,captura){ if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false;}

function crearXMLHttpRequest() { var xmlHttp=null; if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest(); return xmlHttp;}Como podemos observar tiene mucho en comn con el primer ejemplo de AJAX que habamos desarrollado.Lo primero que hacemos es inicializar el evento load con la funcin inicializarEventos, en esta inicializamos el evento click del nico botn que contiene la pgina:addEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ob=document.getElementById('boton1'); addEvent(ob,'click',presionBoton,false);}Cuando se presiona el botn se dispara la funcin presionBoton, donde obtenemos la referencia a los dos controles (select y text) que tienen almacenados los valores. Llamamos finalmente a la funcin cargarVoto:function presionBoton(e){ var ob1=document.getElementById('voto'); var ob2=document.getElementById('nombre'); cargarVoto(ob1.value,ob2.value);}La funcin cargarVoto recibe como parmetro el valor del voto y el nombre del visitante, seguidamente llama a la funcin crearXMLHttpRequest.Por ltimo inicializamos la propiedad onreadystatechange y llamamos a los mtodos open y send. En el mtodo open pasamos los dos datos en la cabecera de la peticin de pgina.var conexion1;function cargarVoto(voto,nom) { conexion1=crearXMLHttpRequest() conexion1.onreadystatechange = procesarEventos; conexion1.open('GET','pagina1.php?puntaje='+voto+'&nombre='+nom, true); conexion1.send(null);}Nos queda la funcin procesarEventos, que cuando la propiedad readyState del objeto XMLHttpRequest tiene un valor 4 (proceso completado) recupera el valor de la propiedad responseText con la informacin que se retorn desde el servidor:function procesarEventos(){ var resultados = document.getElementById("resultados"); if(conexion1.readyState == 4) { resultados.innerHTML = conexion1.responseText; } else { resultados.innerHTML = 'Cargando...'; }}

El archivo PHP que se ejecuta en el servidor es el siguiente:pagina1.php

Lo primero que hacemos es abrir el archivo para agregar datos, es decir no borramos los votos existentes (puede probar de cambiar "a" de append por "w" que crea el archivo):$ar=fopen("puntaje.txt","a") or die("No se pudo abrir el archivo");Luego recuperamos los parmetros que llegan a la pgina y los grabamos:fputs($ar,"Nombre:".$_REQUEST['nombre']."
");fputs($ar,"Voto:".$_REQUEST['puntaje']."

");Cerramos y abrimos nuevamente el archivo, pero ahora con el objetivo de leerlo:fclose($ar);$ar=fopen("puntaje.txt","r") or die("No se pudo abrir el archivo");Por ltimo generamos el archivo a retornar al navegador:while (!feof($ar)){ $linea=fgets($ar); echo $linea;}Con este segundo ejemplo debemos poder identificar que partes son comunes al problema anterior.6 - Pasando datos al servidor por el mtodo GET.Para indicar cual es el mtodo de envo de los datos al servidor lo hacemos en el primer parmetro del mtodo open del objeto XMLHttpRequest:conexion1.open('GET','pagina1.php?puntaje='+voto+'&nombre='+nom, true);En este ejemplo vemos como indicamos que el envo de los datos se hace por el mtodo GET. Si lo hacemos de esta forma tenemos que tener mucho cuidado en la codificacin del segundo parmetro del mtodo open donde indicamos el nombre de la pgina a pedir.Seguido al nombre de la pgina debe ir el signo de interrogacin, el nombre del parmetro, luego un igual y el valor del parmetro. En caso de haber ms de un parmetro debemos separarlos mediante el caracter ampersand.Por ltimo el tercer parmetro del mtodo open normalmente se pasa el valor true indicando que el requerimiento de la pgina es asncrona (esto permite al visitante continuar interactuando con la pgina sin que se congele hasta llegar la solicitud)Confeccionaremos un problema similar al anterior, es decir que nos permita calificar una foto con un valor de 1 al 10. La diferencia es que la calificacin ser por medio de una lista de hipervnculos del 1 al 10. Adems haremos que la barra de seleccin de la calificacin cambie de color cuando ingresamos con el mouse.Veremos que la mayor dificultad se encuentra en la codificacin de esta ltima caracterstica ms que en la comunicacin asincrnica.El archivo HTML es (pagina1.html):

Problema

Vote esta foto

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10


Ver resultados

La foto se encuentra en el directorio inmediatamente superior por eso indicamos el ../ :

Para no complicar ms el problema el archivo de resultados se almacena en un archivo de texto llamado votos.txt (al presionar el hipervnculo procedemos a mostrarlo en el navegador, esto nos podr permitir verificar si realmente el voto se registr en el servidor):Ver resultadosCada hipervnculo pasa como parmetro la calificacin respectiva:123La hoja de estilo queda definida como sigue (estilos.css):.voto { padding:0px;}.voto a { float:left; width:15px; text-decoration:none; text-align:center; color:#f00; background-color:#f7f8e8; border-right:1px solid white; font-size:13px;}

.voto li { display:inline;}Como la lista de hipervnculos los queremos todos en la misma lnea inicializamos la propiedad display con el valor inline:.voto li { display:inline;}Luego donde se encuentra la complejidad mayor es en funciones.js:addEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ref=document.getElementById('votofoto1'); var vec= ref.getElementsByTagName('li'); var vec2=ref.getElementsByTagName('a'); for(f=0;f7 - Pasando datos al servidor por el mtodo POST.Podemos enviar los datos por el mtodo GET, como hemos visto hasta ahora, pero tambin podemos enviar los datos por el mtodo POST.El mtodo POST se utiliza cuando hay que enviar mucha informacin al servidor.Hay varios puntos a tener en cuenta para cuando codificamos los datos para el envo por el mtodo POST:Cuando llamamos al mtodo open del objeto XMLHttpRequest como primer parmetro indicamos el string 'POST' conexion1.open('POST','pagina1.php', true); Llamamos al mtodo setRequestHeader indicando que los datos a enviarse estn codificados como un formulario. conexion1.setRequestHeader("Content-Type","application/x-www-form-urlencoded");Llamamos al mtodo send del objeto XMLHttpRequest pasando los datos:conexion1.send("nombre=juan&clave=z80");Podemos concatenar datos extraidos de un formulario y enviarlos a travs del mtodo send.Confeccionaremos un problema completo para probar la funcionalidad del envo de datos por el mtodo POST.Haremos una serie de pginas que nos permitan enviar los datos cargados en un formulario al servidor en forma asincrnica y por lo tanto no tendremos que refrescar la pgina luego de enviado los datos. El formulario solicitar que ingrese el nombre y comentarios del sitio.El archivo HTML es el siguiente (pagina1.html):

Problema

Nombre:
Comentarios:

Ver resultados

Este archivo HTML no tiene nada de especial, bsicamente es un formulario con un control de tipo input, otro de tipo textarea y finalmente un botn para el envo de los datos al servidor. Adems contiene un div vaco para mostrar mensajes sobre el resultado del envo de los datos al servidor.Disponemos un hipervnculo al archivo de texto que almacenar los datos cargados, esto con el objetivo de poder controlar si los datos realmente se cargaron en el servidor. En un problema ms grande seguramente los datos los almacenaremos en una base de datos.El archivo funciones.js es:addEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ref=document.getElementById('formulario'); addEvent(ref,'submit',enviarDatos,false);}

function enviarDatos(e){ if (window.event) window.event.returnValue=false; else if (e) e.preventDefault(); enviarFormulario();}

function retornarDatos(){ var cad=''; var nom=document.getElementById('nombre').value; var com=document.getElementById('comentarios').value; cad='nombre='+encodeURIComponent(nom)+'&comentarios='+encodeURIComponent(com); return cad;}

var conexion1;function enviarFormulario() { conexion1=crearXMLHttpRequest(); conexion1.onreadystatechange = procesarEventos; conexion1.open('POST','pagina1.php', true); conexion1.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); conexion1.send(retornarDatos()); }

function procesarEventos(){ var resultados = document.getElementById("resultados"); if(conexion1.readyState == 4) { resultados.innerHTML = 'Gracias.'; } else { resultados.innerHTML = 'Procesando...'; }}

//***************************************//Funciones comunes a todos los problemas//***************************************function addEvent(elemento,nomevento,funcion,captura){ if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false;}

function crearXMLHttpRequest() { var xmlHttp=null; if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest(); return xmlHttp;}Lo primero que hacemos en la funcin inicializarEventos es: var ref=document.getElementById('formulario'); addEvent(ref,'submit',enviarDatos,false);Obtener la referencia del formulario e inicializar el evento submit para poder capturar el momento en que los datos se enviarn al servidor. Es decir la funcin enviarDatos se ejecutar cuando el operador presione el botn de tipo submit.La funcin enviarFormulario:var conexion1;function enviarFormulario() { conexion1=crearXMLHttpRequest() conexion1.onreadystatechange = procesarEventos; conexion1.open('POST','pagina1.php', true); conexion1.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); conexion1.send(retornarDatos()); }Inicializa el objeto XMLHttpRequest indicando en el mtodo open que los datos se enviarn mediante el comando POST.Luego llamamos al mtodo setRequestHeader indicando el tipo de contenido a enviar al servidor.Finalmente llamamos al mtodo send con los datos. Estos datos los recuperamos del formulario llamando a la funcin retornarDatos() que a continuacin la explicaremos.function retornarDatos(){ var cad=''; var nom=document.getElementById('nombre').value; var com=document.getElementById('comentarios').value; cad='nombre='+encodeURIComponent(nom)+'&comentarios='+encodeURIComponent(com); return cad;}Obtenemos el valor contenido en cada control (input y textarea) y luego concatenamos nombre del dato y valor separndolos por el caracter mpersand.Otra cosa importante es llamar a la funcin JavaScript encodeURIComponent para codificar los datos ingresados por el visitante y se puedan enviar correctamente al servidor.La funcin procesarEventos:function procesarEventos(){ var resultados = document.getElementById("resultados"); if(conexion1.readyState == 4) { resultados.innerHTML = 'Gracias.'; } else { resultados.innerHTML = 'Procesando...'; }}Dijimos ya que esta funcin se ejecuta cada vez que cambia el estado del objeto XMLHttpRequest. Cuando retorna un 4 significa que el envo de datos se efectu en forma correcta, mostramos en ese momento el mensaje 'Gracias'.El ltimo archivo: pagina1.php

Simplemente rescatamos los datos enviados desde el navegador y procedemos a grabarlos en el archivo de texto.8 - Recuperando datos mediante la propiedad responseText del objeto XMLHttpRequestAhora nos concentraremos en la propiedad responseText del objeto XMLHttpRequest. Esta propiedad almacena el valor devuelto por el servidor.Normalmente accederemos a la propiedad responseText cuando el objeto XMLHttpRequest nos informa que toda la informacin fue remitida por el servidor, esto ocurre cuando la propiedad readyState del objeto XMLHttpRequest almacena el valor 4.Lo ms comn es que tengamos un cdigo similar al siguiente:function procesarEventos(){ var detalles = document.getElementById("comentarios"); if(conexion1.readyState == 4) { detalles.innerHTML = conexion1.responseText; } else { detalles.innerHTML = 'Cargando...'; }}Confeccionaremos un ejemplo para identifiar donde utilizar la propiedad responseText. El problema consiste en mostrar una lista de hipervnculos que representan los comentarios de distintas fecha. El objetivo es rescatar todos los comentarios para la fecha seleccionada por el visitante y su posterior visualizacin sin tener que recargar nuevamente la pgina.El archivo pagina1.html es:

Problema

Seleccione la fecha:

ver comentarios del 10/03/2007
ver comentarios del 11/03/2007
ver comentarios del 12/03/2007

Comentarios: Cada hipervnculo dispone como parmetro la fecha de la cual queremos recuperar los comentarios.Disponemos un div donde visualizaremos los comentarios de la fecha seleccionada.La hoja de estilo estilos.css es:.recuadro { background-color:#ffffcc; text-align:left; font-family:verdana; border-width:0; padding:5px; border: 1px dotted #ffaa00;}Luego el archivo funciones.js es:addEvent(window,'load',inicializarEventos,false);

function inicializarEventos(){ var ref; ref=document.getElementById('fecha'); var vec=ref.getElementsByTagName('a'); for(f=0;f