Reconocimiento No comercial Jos Antonio Muoz Jimnez jamj2000 at gmail dot com Marzo 2010 Pg. 1 de 24 Programacin con AJAX Introduccin. Qu es AJAX? Dnde se utiliza? Ventajas y desventajas El ormato XML !once"tos de Javascript Varia#les $rrays Diccionarios %unciones y Eventos El o#jet o XMLHttpReqest &todos del o#jeto '&()tt"Re*uest "ara o#tener inormacin o"en setRe*uest)eader send +ro"iedades de mtodo '&()tt"Re*uest onreadystatec,an-e ready.tate res"onse/e0t res"onse'&( El o#jeto docment &todos "ara -estionar la inormacin -etElements1y/a-Name -etElement1yId -et$ttri#ute (a "ro"iedad inner)/&( !om"ati#ilidad con distintos nave-adores Pg. 2 de 24 Programacin con AJAX !ntrodccin $2$' es una tcnica de desarrollo 3e# "ara crear a"licaciones interactivas *ue se ejecutan en el cliente4 es decir4 en el nave-ador de los usuarios mientras se mantiene la comunicacin as"ncrona con el servidor en se-undo "lano. De esta orma es "osi#le realizar cam#ios so#re las "5-inas sin necesidad de recar-arlas4 lo *ue si-niica aumentar la interactividad4 velocidad y usa#ilidad en las a"licaciones. Dic,a tcnica es am"liamente utilizada en la 6e# 7.8. $2$' si-ni9ca $sync,ronous 2avascri"t $nd '&( +ueden verse ejem"los de a"licaciones 3e# *ue ,acen uso de $2$' en: ;oo-le <;mail4 ;oo-le ma"s4 ;oo-le docs4 ;oo-le su--est4 ...= %lic>r /3itter Di-- y Reddit &ee#o En este mini?tutorial encontraras diversos ejem"los *ue tratan distintos as"ectos de $2$'. Actividades propuestas )acer un listado de al menos @8 sitios de internet *ue ,acen uso de $2$'. )acer un resumen de la ,istoria de la tecnolo-Aa $2$'. Pg. # de 24 Programacin con AJAX $% &ormato XML (a mayorAa de la comunicacin de datos en $2$' entre un servidor y un cliente 3e# suele realizarse en ormato '&(. +or ello es aconseja#le ad*uirir un conocimiento #5sico de este ormato. Este conocimiento "odrAa resumirse de orma muy escueta en *ue todo documento '&(: tiene uno y slo un nodo raAz. todas las eti*uetas de#en de tener su eti*ueta de cierre corres"ondiente. +or ejem"lo4 teniendo en cuenta esto4 "odemos crear un arc,ivo datos.'m%: <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/css" href="estilo.css" ?> <alumnos> <alumno>Jos Antonio</alumno> <alumno>Susana</alumno> <alumno>Ana</alumno> </alumnos> $ un arc,ivo '&( "uede asociarsele una ,oja de estilo !..4 si lo indicamos en su ca#ecera mediante <?xml-stylesheet type="text/css" href="estilo.css" ?> Pg. 4 de 24 Programacin con AJAX +or ejem"lo4 la ,oja esti%o.css( // Etiquetas XML * { margin: 0px; padding: 0px; } alumnos { font-size: 14pt; } alumno { display: block; background-color: Wheat; } alumno:before { content: "Alumno/a: "; padding-left: 10px; padding-right: 10px; margin-right: 20px; background-color: Tan; } // Etiquetas HTML * { margin: 0px; padding: 0px; } #resultado { overflow: auto; width: 500px; height: 200px; background-color: LightGrey; border: 1px solid Black; padding: 10px; } !on lo cual se verAa de la si-uiente orma en el nave-ador: Pg. ) de 24 Programacin con AJAX Actividades propuestas &odiicar el arc,ivo datos.0ml "ara *ue a"arezcan al menos @8 alumnos. $Badir al arc,ivo datos.0ml al menos C "roesores. &odiicar estilo.css "ara *ue se muestren adecuadamente los "roesores. Ela#orar un nuevo arc,ivo '&( *ue muestre otro ti"o de inormacin4 con su estilo !.. asociado. Proporcionando datos desde e% servidor $ menudo no se accede a los datos '&( de orma directa sino *ue estos son -enerados de orma din5mica en el servidor4 normalmente mediante un scri"t +)+. +or ejem"lo esa inormacin "odrAa o#tenerse de una #ase datos cuya inormacin cam#ia con el tiem"o. $ modo de sim"liicacin mostramos un sencillo scri"t datos.p*p: <?php sleep (2); // Simulamos un retardo de 2 seg. header('Content-type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" ?> <alumnos> <alumno>Jos Antonio</alumno> <alumno>Susana</alumno> <alumno>Ana</alumno> </alumnos> '; ?> Actividades propuestas &odiicar el scri"t datos."," "ara *ue a"arezcan al menos @8 alumnos. Realizar una llamada a datos."," desde el nave-ador. Pg. + de 24 Programacin con AJAX ,-teniendo datos desde e% c%iente En el lado del cliente estos datos "ueden o#tenerse de dos ormas: (a orma tradicional &ediante $2$' La &orma tradiciona% !reamos un arc,ivo ver.*tm% y ,acemos la "eticin mediante un su#mit. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <form action="datos.php" method="get" enctype="text/plain"> <input type="submit" value="Obtener datos"> </form> </body> </html> Pg. . de 24 Programacin con AJAX Mediante AJAX !reamos un arc,ivo ver/a0a'.*tm% y ,acemos la "eticin en javascri"t. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <script type="text/javascript"> var datos; function pedir_datos (url) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("GET", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(null); } function mostrar_datos () { if (datos.readyState == 4) document.getElementById('resultado').innerHTML = datos.responseText; } </script> </head> <body> <form action="javascript:pedir_datos('datos.php');"> <input type="submit" value="Obtener datos"> </form> <div id='resultado'> </div> </body> </html> Pg. 1 de 24 Programacin con AJAX ,-servaciones $un*ue en "rinci"io "ueda "arecer *ue ,ay "oca dierencia entre am#as ormas de o#tener y mostrar la inormacin y *ue incluso el uso de $2$' es al-o m5s com"licado4 e0isten dierencias im"ortantes. Estas son: En la orma tradicional e0iste un cam#io de "5-ina <o#serva *ue en DR( a"arece ,tt":EElocal,ostEaja0Edatos.","=. Esto elimina de la vista del usuario toda la inormacin *ue tuviramos "reviamente. &ediante $2$'4 la inormacin se muestra en la misma "5-ina ori-inal < o#serva *ue en DR( si-ue a"areciendo ,tt":EElocal,ostEaja0EverFaja0.,tml=. Esto nos "ermite tra#ajar en la misma "5-ina como si nada ,u#iera sucedido actualiz5ndose sta con nueva inormacin cuando sea necesario. Normalmente el Gcuando sea necesarioH si-niica cuando ocurra al-In evento *ue deseemos tener en cuenta. Jtras cuestiones a tener en cuenta: !uando usamos $2$' de#emos tener una divisin o ca"a <DIV= en la cual mostraremos los datos. +or ejem"lo: <div id='resultado'> </div> +odemos acceder a dic,a ca"a y mostrar el resultado mediante: document.getElementById('resultado').innerHTML = "<b>Aqu va el resultado</b>"; Res%tado El uso de $2$' nos "ermitir5 *ue el usuario ten-a una e0"eriencia m5s luida en la interaccin con nuestro servidor 3e# y dar5 a nuestras "5-inas un diseBo m5s "roesional. $,ora slo nos alta aBadir una ,oja de estilo a la "5-ina verFaja0.,tml y tendremos nuestra "rimera a"licacin $2$' medianamente decente. <link rel="stylesheet" type="text/css" href="estilo.css" /> El resultado "uede verse a continuacin. Pg. 2 de 24 Programacin con AJAX <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="estilo.css" /> <script type="text/javascript"> var datos; function pedir_datos (url) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("GET", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(null); } function mostrar_datos () { if (datos.readyState == 4) document.getElementById('resultado').innerHTML = datos.responseText; } </script> </head> <body> <form action="javascript:pedir_datos('datos.php');"> <input type="submit" value="Obtener datos"> </form> <div id='resultado'> </div> </body> </html> Pg. 13 de 24 Programacin con AJAX Actividades propuestas &odiicar verFaja0.,tml "ara *ue los datos se muestren en 7 ca"as distintas a la vez. &odiicar verFaja0.,tml "ara *ue los datos se muestren en K ca"as distintas a la vez. 4onceptos de Javascript Variables En 2avascri"t las varia#les no tienen ti"o. var dato; dato = 123; // ahora dato es un entero dato = "Hola que tal!"; // ahora dato es una cadena de texto dato = new Array (); // ahora dato es un array dato = {}; // ahora dato es un diccionario 2avascri"t realiza las conversiones im"lAcitas necesarias. +ara dar valores a un arra5( var direccion = new Array (); direccion[0] = "Avda. "; direccion[1] = "Estudiantes "; direccion[2] = 99; alert (direccion[0] + direccion[1] + direccion[2]); +ara dar valores a un diccionario( var nota = {}; nota["Rocio"] = "Sobresaliente"; nota["Eva"] = "Notable"; nota["Jairo"] = "Suficiente"; alert (nota["Rocio"] + "\n" + nota["Eva"] + "\n" + nota["Jairo"]); Pg. 11 de 24 Programacin con AJAX Actividades propuestas .i tenemos la si-uiente uncin mostrarFdatos<= y el si-uiente #ody4 cual ser5 el resultado. Qu ti"o de dato es la varia#le d? function mostrar_datos () { if (datos.readyState == 4) { var d = document.getElementsByTagName('div'); d[0].innerHTML = datos.responseText; d[1].innerHTML = datos.responseText; d[2].innerHTML = datos.responseText; d[3].innerHTML = datos.responseText; } } <body> <form> <input type="button" value="Obtener datos" onclick='pedir_datos("datos.php")'> </form> <div> </div><br/> <div> </div><br/> <div> </div><br/> <div> </div><br/> </body> Escri#e una "5-ina con el si-uiente contenido. )az una ca"tura de "antalla de cada mensaje de alerta *ue a"arezca. <html> <head> <script type="text/javascript"> var direccion = new Array(); var nota = {}; direccion[0] = "Avda. "; direccion[1] = "Estudiantes "; direccion[2] = 99; nota["Rocio"] = "Sobresaliente"; nota["Eva"] = "Notable"; nota["Jairo"] = "Suficiente"; alert (direccion[0] + direccion[1] + direccion[2]);
</script> </head> <body></body> </html> &odiicar el ejercicio anterior "ara *ue a"arezca la direccin del alumnoEa y su nota en el mismo cuadro de alerta. De#e ,acerse C veces <C alumnos=. Pg. 12 de 24 Programacin con AJAX Funciones y Eventos El cdi-o 2avascri"t "uede a-ru"arse dentro de unciones. +or ejem"lo mediante function pedir_datos (url) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("GET", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(null); } ,emos a-ru"ado varias sentencias dentro de la uncin pedir_datos (url). $ menudo es Itil asociar la ejecucin del cdi-o de una uncin al dis"aro de un evento. Es decir cuando se "roduce determinado evento <"ulsacin del ratn4 "ulsacin de una tecla4 movimiento del ratn4 car-a de la "5-ina4 L= No todos los elementos de una "5-ina so"ortan todos los eventos. $ continuacin se muestra una #reve lista: Mane0ador de evento ,-0etos para %os qe est de&inido on$#ort Ima-e on1lur 1utton4 !,ec>#o04 %ileD"load4 (ayer4 +ass3ord4 Radio4 Reset4 .elect4 .u#mit4 /e0t4 /e0tarea4 3indo3 on!,an-e %ileD"load4 .elect4 /e0t4 /e0tarea on!lic> 1utton4 document4 !,ec>#o04 (in>4 Radio4 Reset4 .u#mit onD#l!lic> document4 (in> onDra-Dro"4 on(oad4 onDnload 3indo3 onError Ima-e4 3indo3 on%ocus 1utton4 !,ec>#o04 %ileD"load4 (ayer4 +ass3ord4 Radio4 Reset4 .elect4 .u#mit4 /e0t4 /e0tarea4 3indo3 onMeyDo3n document4 Ima-e4 (in>4 /e0tarea onMey+ress document4 Ima-e4 (in>4 /e0tarea onMeyD" document4 Ima-e4 (in>4 /e0tarea on(oad Ima-e4 (ayer4 3indo3 on&ouseDo3n 1utton4 document4 (in> on&ouse&ove Nin-uno <de#e asociarse a uno= on&ouseJut (ayer4 (in> on&ouseJver (ayer4 (in> on&ouseD" 1utton4 document4 (in> on&ove 3indo3 Pg. 1# de 24 Programacin con AJAX onReset4 on.u#mit %orm onResize 3indo3 on.elect /e0t4 /e0tarea Nosotros4 en nuestro ejem"lo4 ,emos asociado4 de &orma imp%"cita6 la uncin pedir/datos7r%8 al dis"aro del evento on9-mit en el ormulario. <form action= "javascript:pedir_datos('datos.php');" > <input type="submit" value="Obtener datos"> </form> De &orma e'p%"cita serAa: <form action="#" onsubmit= "pedir_datos('datos.php'); return false;" > <input type="submit" value="Obtener datos"> </form> $ continuacin se muestran otros "osi#les eventos de dis"aro. $l "ulsar un #otn normal <body> <input type="button" value="Obtener datos" onclick= "pedir_datos('datos.php')" > <div id='resultado'> </div> </body> $l car-ar la "5-ina <body onload= "pedir_datos('datos.php')" > <div id='resultado'> </div> </body> $l "asar "or encima de la ca"a <DIV= del resultado <body> <div id='resultado' onmouseover= "pedir_datos('datos.php')" > </div> </body> $l cam#iar el valor de un cuadro de seleccin <body> <select onchange= "pedir_datos('datos.php')" > <option> Pedir datos </option> <option> Pedir otra vez </option> <option> Volver a pedir </option> </select> <div id='resultado'> </div> </body> Actividades propuestas &odiica verFaja0.,tml de modo *ue "rue#es el uncionamiento de los K casos anteriores. Pg. 14 de 24 Programacin con AJAX $% o-0eto XMLHttpReqest Obteniendo los datos desde el servidor +ara o#tener los datos desde el servidor utilizamos la &ncin pedir_datos(). var datos; function pedir_datos (url) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("GET", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(null); } (a uncin "edirFdatos <= la asociaremos a un evento4 de modo *ue se ejecute cuando a nosotros nos interese. Este evento "odrAa ser la car-a de la "5-ina4 la "ulsacin de un #otn del ratn4 el cam#io en un select4 L (a uncin "edirFdatos <= ,ace lo si-uiente: !rea un o#jeto '&()tt"Re*uest datos = new XMLHttpRequest(); $socia la uncin mostrarFdatos <= "ara se ejecute cuando se "roduzca un cam#io de estado en dic,o o#jeto. datos.onreadystatechange = mostrar_datos; $#re la "eticin de DR(. datos.open("GET", url, true); EnvAa las ca#eceras. datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); EnvAa los "ar5metros. datos.send(null); ,-servaciones J#serva *ue necesitamos una varia-%e g%o-a% datos donde se almacenar5 la inormacin *ue reci#amos. Dic,a varia#le ser5 utilizada des"us "or la uncin mostrarFdatos<=. +odrAa ser necesaria asimismo "ara otras unciones. Pg. 1) de 24 Programacin con AJAX Pasando datos al servidor .uele ser ,a#itual cuando se ,ace una "eticin4 *ue en dic,a "eticin se envAe inormacin al servidor desde el cliente. Esto suele ,acerse en la orma variable1=valor1&variable2=valor2... (a orma de "asar "ar5metros de"ende de si utilizamos el mtodo ;E/ o el mtodo +J./. $m#os mtodos son m5s o menos e*uivalentes4 aun*ue el mtodo +J./ es es"ecialmente Itil cuando se tra#aja con ormularios. M:todo ;$< !on el mtodo ;E/ los "ar5metros se "asan en la misma DR(. datos.open("GET", "datos.php?curso=SMR2&tutor=Jos+Antonio", true); datos.send(null); M:todo P,9< !on el mtodo +J./ los "ar5metros se "asan con la uncin datos.send<=. datos.open("POST", "datos.php", true); datos.send("curso=SMR2&tutor=Jos+Antonio"); Pg. 1+ de 24 Programacin con AJAX Ejem"los: 718 ;$< tradiciona% <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <form method="get" action="get.php"> <label>Curso: </label> <select name="curso"> <option value="SMR1" > SMR1 </option> <option value="SMR2" selected> SMR2 </option> </select> <label>Tutor: </label> <input type="text" name="tutor" value="Jos Antonio" /> <input type="submit" name="submit" value="OK" /> </form> </html> <?php header('Content-type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" ?> <mensaje>El tutor del curso '.$_GET[curso].' es '.$_GET[tutor].'</mensaje>'; ?> %Ajate en la =RL resultante: ,tt":EElocal,ostEaja0Eget.p*p?crso>9MR2?ttor>Jos:@Antonio?s-mit>,A <7= +J./ tradicional <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <form method="post" action="post.php"> <label>Curso: </label> <select name="curso"> <option value="SMR1" > SMR1 </option> <option value="SMR2" selected> SMR2 </option> </select> <label>Tutor: </label> <input type="text" name="tutor" value="Jos Antonio" /> <input type="submit" name="submit" value="OK" /> </form> </html> <?php header('Content-type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" ?> <mensaje>El tutor del curso '.$_POST[curso].' es '.$_POST[tutor].'</mensaje>'; ?> Pg. 1. de 24 g e t . p h p g e t . h t m l p o s t . p h p p o s t . h t m l Programacin con AJAX 7#8 ;$< con AJAX <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="estilo.css" /> <script type="text/javascript"> var datos;
function pedir_datos (url, params) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("GET", url+ '?' +params , true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(null); } function mostrar_datos () { if (datos.readyState == 4) document.getElementById('resultado').innerHTML = datos.responseText; } function iniciar() { var url = 'get.php'; var params = f.curso.name +'='+ f.curso.value +'&'+ f.tutor.name +'='+ f.tutor.value; pedir_datos(url, params); } </script> </head> <body> <form name="f" method="get" action="javascript: iniciar ()"> <label>Curso: </label> <select name="curso"> <option value="SMR1" > SMR1 </option> <option value="SMR2" selected> SMR2 </option> </select> <label>Tutor: </label> <input type="text" name="tutor" value="Jos Antonio" /> <input type="submit" name="submit" value="OK" /> </form> <div id="resultado"> </div> </html> Pg. 11 de 24 g e t _ a j a x . h t m l Programacin con AJAX 748 P,9< con AJAX <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="estilo.css" /> <script type="text/javascript"> var datos; function pedir_datos (url, params) { datos = new XMLHttpRequest(); datos.onreadystatechange = mostrar_datos; datos.open("POST", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //datos.setRequestHeader("Content-length", params.length); datos.setRequestHeader("Connection", "close"); datos.send(params); } function mostrar_datos () { if (datos.readyState == 4) document.getElementById('resultado').innerHTML = datos.responseText; } function iniciar() { var url = 'post.php'; var params = f.curso.name +'='+ f.curso.value +'&'+ f.tutor.name +'='+ f.tutor.value; pedir_datos(url, params); } </script> </head> <body> <form name="f" method="post" action="javascript: iniciar()"> <label>Curso: </label> <select name="curso"> <option value="SMR1" > SMR1 </option> <option value="SMR2" selected> SMR2 </option> </select> <label>Tutor: </label> <input type="text" name="tutor" value="Jos Antonio" /> <input type="submit" name="submit" value="OK" /> </form> <div id="resultado"> </div> </html> Actividades propuestas Editar los K ejem"los anteriores y com"ro#ar su correcto uncionamiento. &odiica el Iltimo ejem"lo "ara *ue devuelva una lista de alumnos distinta de"endiendo del curso. Pg. 12 de 24 p o s t _ a j a x . h t m l Programacin con AJAX $% o-0eto docment Visualizando los datos dentro del cliente +ara mostrar los datos en el cliente utilizamos la &ncin mostrar_datos(). function mostrar_datos () { if (datos.readyState == 4) document.getElementById('resultado').innerHTML = datos.responseText; } Jtra orma al-o m5s detallada es function mostrar_datos () { if (datos.readyState == 4 && datos.status == 200) document.getElementById('resultado').innerHTML = datos.responseText; } (a condicin if (datos.readyState == 4 && datos.status == 200) com"rue#a *ue e0iste una res"uesta com"leta del servidor <datos.ready.tate NN K= y *ue dic,a res"uesta es satisactoria <datos.status NN 788=. (os valores "ara datos.read59tate son: 3. Indica *ue el o#jeto e0iste "ero no ,a sido aIn inicializado. 1. El o#jeto ,a sido inicializado tras la llamada al mtodo o"en<=. 2. (a "eticin ,a sido enviada. #. .e ,a reci#ido una res"uesta "arcial a la "eticin. 4. .e ,a reci#ido una res"uesta com"leta y la cone0in ,a sido cerrada. (os valores "ara datos.stats m5s recuentes suelen ser: 233. Indica *ue la "eticin )//+ se llev a ca#o satisactoriamente. 43#. Indica *ue el servidor entendi la "eticin )//+4 "ero no "uede llevarla a ca#o. +or ejem"lo4 de#ido a un "ro#lema de "ermisos. 434. Indica *ue el recurso solicitado no e0iste. )33. Indica *ue se ,a "roducido un error interno en el servidor al intentar res"onder a la "eticin. (a sentencia document.getElementById('resultado').innerHTML = datos.responseText; co-e los datos en ormato te0to <datos.res"onse/e0t= y vuelca <inner)/&(= su contenido en el elemento identiicado como OresultadoO. Pg. 23 de 24 Programacin con AJAX Tratando los datos en el cliente Ima-inemos *ue deseamos mostrar los datos en orden inverso a como los o#tenemos4 o mostrar slo las lAneas "ares4 o mostrar slo las *ue cum"lan cierta condicin. +ara ,acer esto necesitamos o#tener los datos en ormato '&( y no en ormato /e0to como ,asta a,ora. &ediante datos.responseXML o#tendremos un o#jeto '&( listo "ara "oder ser inter"retado. (a si-uiente uncin nos muestra los datos en el orden reci#ido. function mostrar_datos () { var a = new Array (); if (datos.readyState == 4) { a = datos.responseXML.getElementsByTagName ("alumno"); for (i = 0; i < a.length; i++) document.getElementById('resultado').innerHTML += a[i].firstChild.data + "<br/>"; } } (a si-uiente uncin nos muestra los datos en orden inverso. function mostrar_datos () { var a = new Array (); if (datos.readyState == 4) { a = datos.responseXML.getElementsByTagName ("alumno"); for (i = a.length-1; i >= 0; i--) document.getElementById('resultado').innerHTML += a[i].firstChild.data + "<br/>"; } } (os datos de cada alumno se -uardan en la varia#le local a[i]. +ara acceder a los datos entre la eti*ueta de inicio y la de cierre se utiliza a[i].firstChild.data En el caso de dis"oner de atri#utos4 tam#in es "osi#le acceder a ellos. .u"on-amos *ue tenemos el si-uiente contenido '&(: <alumnos> <alumno edad="18" sexo="V">Jos Antonio</alumno> <alumno edad="17" sexo="M">Susana</alumno> <alumno edad="19" sexo="M">Ana</alumno> </alumnos> Pg. 21 de 24 Programacin con AJAX (a si-uiente uncin nos mostrar5 los datos entre las eti*uetas de inicio y cierre y el valor de los atri#utos edad y sexo. function mostrar_datos () { var a = new Array (); if (datos.readyState == 4) { a = datos.responseXML.getElementsByTagName ("alumno"); for (i = 0; i < a.length; i++) document.getElementById('resultado').innerHTML += a[i].firstChild.data + " edad = " + a[i].getAttribute ('edad') + " sexo = " + a[i].getAttribute ('sexo') + " <br/>"; } } +ara acceder al valor del atri#uto edad se utiliza a[i].getAttribute ('edad') +ara acceder a cual*uier otro atri#uto se "rocede de idntica orma. Actividades propuestas &odiicar el arc,ivo datos."," "ara *ue a"arezcan al menos @8 alumnosEas con los atri#utos de edad y se0o. &odiicar el arc,ivo verFaja0.,tml "ara *ue se muestren slo las lAneas "ares. &odiicar el arc,ivo verFaja0.,tml "ara *ue se muestren slo los alumnosEas mayores de @P aBos. &odiicar el arc,ivo verFaja0.,tml "ara *ue se muestren slo las alumnas. Pg. 22 de 24 Programacin con AJAX 4ompati-i%idad con distintos navegadores El o#jeto XMLHtttpReqest no se utiliza "or todos los nave-adores4 de ,ec,o Internet E0"lorer4 el nave-ador m5s utilizado en la actualidad4 utiliza el o#jeto ActiveX,-0ect. +or lo tanto la uncin pedir/datos 7r%8 de#e ser modiicada de la orma *ue se muestra a continuacin. Esta uncin tam#in realiza el tratamiento de las "osi#les e0ce"ciones en tiem"o de ejecucin. var datos; function pedir_datos(url) { datos = false; // Navegadores Firefox, Safari, ... / XMLHttpRequest if(window.XMLHttpRequest) { try { datos = new XMLHttpRequest(); } catch(e) { datos = false; } } // Navegador IE de Windows / ActiveXObject else if(window.ActiveXObject){ try { datos = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { datos = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { datos = false; } } } if(datos) { datos.onreadystatechange = mostrar_datos; datos.open("GET", url, true); datos.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); datos.setRequestHeader("Connection", "close"); datos.send(""); } } Actividades propuestas Ela#orar una a"licacin $2$' *ue sea com"ati#le con todos los nave-adores y *ue em"lee los conocimientos vistos en este tema. Pg. 2# de 24 Programacin con AJAX Re&erencias Javascript *ttp(BBen.CiDipedia.orgBCiDiBJava9cript *ttp(BBCCC.Ce-designtoo%s%ist.comB2332B34BCe-mastertoo%sB0avascriptEc*eatE s*eetsEqicDEre&erenceEgidesE&orE0avascriptECe-mastersEcodersECe-Edeve%opersE designersB *ttp(BBes.CiDipedia.orgBCiDiBJava9cript *ttp(BBCCC.e%codigo.netBcgiE-inBFGread.cgi? ta-%a>*erramientas?campo>3?c%ave>42?in&o>1 AJAX *ttp(BBen.CiDipedia.orgBCiDiBA0a'/7programming8 *ttp(BBCCC.nope.comBa0a'B*oCEa0a'ECorDs.*tm% *ttp(BBes.CiDipedia.orgBCiDiBAJAX CCC.*i-ertEaa%-ers.comB!</!nsig*tB9panis*BPFHB!<!33+9pEAJAX.pd& *ttp(BBCCC.e%rincondea0a'.comBmana%Ea0a'B *ttp(BBCCC.a0a'*ispano.comBqienEsaEa0a'.*tm% *ttp(BBCCC.a0a'*ispano.comBa0a'EnevoEacercamientoEap%icacionesECe-.*tm% Pg. 24 de 24