DWEC07
DWEC07
Contenido
--1--
Modelo de objetos del documento en javascript. Tema 7
El término AJAX (JavaScript Asíncrono y XML) es una técnica de desarrollo web, que permite
comunicar el navegador del usuario con el servidor, en un segundo plano. De esta forma, se podrían
realizar peticiones al servidor sin tener que recargar la página, y podríamos gestionar esas
respuestas, que nos permitirían actualizar los contenidos de nuestra página, sin tener que realizar
recargas.
El término AJAX se presentó por primera vez en el artículo "A New Approach to Web Applications",
publicado por Jesse James Carrett el 18 de febrero de 2005.
AJAX no es una tecnología nueva. Son realmente muchas tecnologías, cada una destacando por su
propio mérito, pero que se unen con los siguientes objetivos:
Conseguir una presentación basada en estándares, usando XHTML, CSS y un uso amplio de
técnicas del DOM, para poder mostrar la información de forma dinámica e interactiva.
Intercambio y manipulación de datos, usando XML y XSLT.
Recuperación de datos de forma asíncrona, usando el objeto XMLHTTPRequest .
Uso de JavaScript, para unir todos los componentes.
-2-
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
El modelo clásico de aplicaciones Web funciona de la siguiente forma: la mayoría de las acciones del
usuario se producen en la interfaz, disparando solicitudes HTTP al servidor web. El servidor efectúa
un proceso (recopila información, realiza las acciones oportunas), y devuelve una página HTML al
cliente. Este es un modelo adaptado del uso original de la Web como medio hipertextual, pero a nivel
de aplicaciones de software, este tipo de modelo no es necesariamente el más recomendable.
Cada vez que se realiza una petición al servidor, el usuario lo único que puede hacer es esperar, ya
que muchas veces la página cambia a otra diferente, y hasta que no reciba todos los datos del
servidor, no se mostrará el resultado, con lo que el usuario no podrá interactuar de ninguna manera
con el navegador. Con AJAX, lo que se intenta evitar, son esencialmente esas esperas. El cliente
podrá hacer solicitudes al servidor, mientras el navegador sigue mostrando la misma página web, y
cuando el navegador reciba una respuesta del servidor, la mostrará al cliente y todo ello sin recargar
o cambiar de página.
AJAX es utilizado por muchas empresas y productos hoy en día. Por ejemplo, Google utiliza AJAX en
aplicaciones como Gmail, Google Suggest, Google Maps.., así como Flickr, Amazon, etc.
Hasta este momento, nuestras aplicaciones de JavaScript no necesitaban de un servidor web para
funcionar, salvo en el caso de querer enviar los datos de un formulario y almacenarlos en una base
de datos. Es más, todas las aplicaciones de JavaScript que has realizado, las has probado
directamente abriéndolas con el navegador o haciendo doble click sobre el fichero .HTML.
Para la programación con AJAX vamos a necesitar de un servidor web, ya que las peticiones AJAX que
hagamos, las haremos a un servidor. Los componentes que necesitamos son:
Servidor web (apache, ligHTTPd, IIS, etc).
Servidor de bases de datos (MySQL, Postgresql, etc).
Lenguaje de servidor (PHP, ASP, etc).
Podríamos instalar cada uno de esos componentes por separado, pero muchas veces lo más cómodo
es instalar alguna aplicación que los agrupe a todos sin instalarlos de forma individual. Hay varios
tipos de aplicaciones de ese tipo, que se pueden categorizar en dos, diferenciadas por el tipo de
sistema operativo sobre el que funcionan:
servidor LAMP (Linux, Apache, MySQL y PHP).
servidor WAMP (Windows, Apache, MySQL y PHP).
Una aplicación de este tipo, muy utilizada, puede ser XAMPP (tanto para Windows, como para Linux).
Esta aplicación podrás instalarla incluso en una memoria USB y ejecutarla en cualquier ordenador,
con lo que tendrás siempre disponible un servidor web, para programar tus aplicaciones AJAX.
-3-
Tema 7 Diseño Web en Entorno Cliente
En el paso 2, mientras se ejecutan los procesos en el servidor, el cliente lo único que puede hacer es
esperar, ya que el navegador está bloqueado en espera de recibir la información con los resultados
del servidor.
Una aplicación AJAX, cambia la metodología de funcionamiento de una aplicación web, en el sentido
de que, elimina las esperas y los bloqueos que se producen en el cliente. Es decir, el usuario podrá
seguir interactuando con la página web, mientras se realiza la petición al servidor. En el momento de
tener una respuesta confirmada del servidor, ésta será mostrada al cliente, o bien se ejecutarán las
acciones que el programador de la página web haya definido.
Mira el siguiente gráfico, en el que se comparan los dos modelos de aplicaciones web:
-4-
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
Cada acción del usuario, que
normalmente generaría una petición
HTTP al servidor, se va a convertir en
una petición AJAX con esa solicitud, y
será este motor, el que se encargará
de todo el proceso de comunicación y
obtención de datos de forma
asíncrona con el servidor, y todo ello
sin frenar la interacción del usuario
con la aplicación.
¿Según los gráficos anteriores, en qué modelo de aplicación web la actividad del usuario se ve
interrumpida o bloqueada por la espera de las respuestas del servidor?
Clásico.
AJAX.
En este modelo cuando hacemos una petición al servidor, tendremos que esperar la respuesta del mismo, y mientras esperamos, la
página estará bloqueada y no nos dejará hacer ninguna otra cosa.
El concepto que está detrás del objeto XMLHTTPRequest , surgió gracias a los desarrolladores
de Outlook Web Access (de Microsoft), en su desarrollo de Microsoft Exchange Server 2000. La
interfaz IXMLHTTPRequest , se desarrolló e implementó en la segunda versión de la librería MSXML,
empleando este concepto. Con el navegador Internet Explorer 5.0 en Marzo de 1999, se permitió el
acceso a dicha interfaz a través de ActiveX.
-5-
Tema 7 Diseño Web en Entorno Cliente
a la interfaz implementada por Microsoft. Mozilla creó un envoltorio para usar esa interfaz, a través
de un objeto JavaScript, el cuál denominó XMLHTTPRequest . El objeto XMLHTTPRequest fue accesible en
la versión 0.6 de Gecko, en diciembre de 2000, pero no fue completamente funcional, hasta Junio de
2002 con la versión 1.0 de Gecko. El objeto XMLHTTPRequest , se convirtió de hecho en un estándar
entre múltiples navegadores, como Safari 1.2, Konqueror, Opera 8.0 e iCab 3.0b352 en el año 2005.
Microsoft añadió el objeto XMLHTTPRequest a su lenguaje de script, con la versión de Internet Explorer
7.0 en Octubre de 2006.
Con la llegada de las librerías cross-browser (capacidad que una web, aplicación web, construcciónHTML o script del lado
del cliente tiene y que permite que sea soportada por todos los navegadores, es decir que se pueda mostrar o ejecutar de forma correcta en
navegador) como jQuery, Prototype, etc, los programadores pueden utilizar toda la
cualquier
funcionalidad de XMLHTTPRequest , sin codificar directamente sobre la API, con lo que se acelera
muchísimo el desarrollo de aplicaciones AJAX.
En febrero de 2008, la W3C publicó otro borrador denominado " XMLHTTPRequest Nivel 2 ". Este nivel
consiste en extender la funcionalidad del objeto XMLHTTPRequest , incluyendo, pero no limitando, el
soporte para peticiones cross-site (peticiones situadas en diferentes dominios), gestión de byte streams (agrupación
de bits en unidades que darán lugar a los bytes), progreso de eventos, etc. Esta última revisión de la
especificación, sigue estando en estado "working draft" (borrador), a septiembre de 2010.
Una de las limitaciones de XMLHTTPRequest es que, por seguridad, sólo nos deja realizar peticiones
AJAX, a las páginas que se encuentren hospedadas en el mismo DOMinio, desde el cual se está
realizando la petición AJAX.
"Tan sólo por la educación puede el hombre llegar a ser hombre. El hombre no es más que lo que la
educación hace de él."
Kant, Immanuel
Una vez más, nos vamos a encontrar con el problema de Internet Explorer, que, dependiendo de la
versión que utilicemos, tendremos que crear el objeto de una manera o de otra. Aquí tienes un
ejemplo de una función cross-browser, que devuelve un objeto del tipo XHR ( XMLHTTPRequest ):
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHTTPRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHTTPRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHTTPRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('MsXML2.XMLHTTP.5.0', 'MsXML2.XMLHTTP.4.0',
'MsXML2.XMLHTTP.3.0', 'MsXML2.XMLHTTP', 'Microsoft.XMLHTTP');
for (var i = 0; i < versionesIE.length; i++){
try{
/* Se intenta crear el objeto en Internet Explorer comenzando
en la versión más moderna del objeto hasta la primera versión.
En el momento que se consiga crear el objeto, saldrá del bucle
-6-
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
devolviendo el nuevo objeto creado. */
return new ActiveXObject(versionesIE[i]);
} catch (errorControlado) {}//Capturamos el error,
}
}
Una opción muy interesante, consiste en hacer una librería llamada, por ejemplo, funciones.js , que
contenga el código de tus funciones más interesantes como, crearEvento() , objetoXHR() , etc. De esta
manera, irás creando tus propios recursos, con el código de JavaScript que más uses en tus
aplicaciones.
"El éxito no se logra sólo con cualidades especiales, es sobre todo un trabajo de constancia, de
método y de organización."
Sergent, J.P.
Metodo Descripción
abort() Cancela la solicitud actual.
getAllResponseHeaders() Devuelve la información completa de la cabecera.
getResponseHeader() Devuelve la información específica de la cabecera.
Especifica el tipo de solicitud, la URL, si la solicitud se debe
gestionar de forma asíncrona o no, y otros atributos opcionales de
la solicitud.
open(metodo, url, async, método: indicamos el tipo de solicitud: GET o POST .
usuario, password) url: la dirección del fichero al que le enviamos las peticiones en
el servidor.
async: true (asíncrona) o false (síncrona).
usuario y password: si fuese necesaria la autenticación en él
Envía la solicitud al servidor.
datos: Se usa en el caso de que estemos utilizando el
send (datos)
método POST , como método de envío. Si usamos GET , datos
será null .
setRequestHeader()
Añade el par etiqueta/valor a la cabecera de datos que se enviará
al servidor.
Para probar el siguiente código, que incluye una petición AJAX, tienes que hacerlo a través del
servidor web. Para ello debes copiar los ficheros del ejemplo, dentro de la raíz del servidor web, en
una carpeta a la que llamaremos, por ejemplo, web/dwec07132 . Arrancaremos el servidor web e
iremos a la dirección HTTP://localhost/web/dwec07132
-7-
Tema 7 Diseño Web en Entorno Cliente
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 1.3.2 - AJAX SINCRONO</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud SINCRONA:<br/>
Esta solicitud tardará 2 segundos aproximadamente, que es el tiempo de ejecución de la
página PHP en el servidor<br/>
Contenedor resultados:<div id="resultados"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarSync: carga el contenido de la url
// en el objeto que se le pasa como referencia,
// usando una petición AJAX de forma SINCRONA.
/////////////////////////////////////////////////////////
function cargarSync(objeto, url){
if (miXHR){
alert("Comenzamos la petición AJAX");
fecha.php
<?php
// retrasamos 2 segundos la ejecución de esta página PHP.
sleep(2);
-8-
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function() {
function w3c_crearEvento(elemento, evento, mifuncion) {
elemento.addEventListener(evento, mifuncion, false);
}
function ie_crearEvento(elemento, evento, mifuncion) {
var fx = function(){
mifuncion.call(elemento);
};
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
-9-
Tema 7 Diseño Web en Entorno Cliente
En esta función se realiza una petición AJAX, pero de forma síncrona (comportamiento normal del
navegador). En dicha petición se realiza la carga del fichero indicado en la url (debe ser un fichero
perteneciente al mismo DOMinio del servidor). La respuesta ( responseText ), que obtenemos en esa
petición, se coloca en un DIV, con la función personalizada textoDIV (su código fuente está en el
fichero funciones.js ).
Para probar el siguiente código, que incluye una petición AJAX, tienes que hacerlo a través del
servidor web. Para ello debes copiar los siguientes ficheros dentro de la raíz del servidor web, en la
carpeta web/dwes07133 , arrancar el servidor web e ir a la dirección HTTP://localhost/web/dwec07133
Puedes utilizar Firebug, para comprobar cómo se está realizando la petición AJAX.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
- 10 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 1.3.3 - AJAX ASINCRONO</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Esta solicitud tardará 2 segundos aproximadamente, que es el tiempo de ejecución de la
página PHP en el servidor<br/>
Contenedor resultados:<div id="resultados"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarSync: carga el contenido de la url
// en el objeto que se le pasa como referencia,
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(objeto, url){
if (miXHR){
alert("Comenzamos la petición AJAX");
fecha.php
<?php
// retrasamos 2 segundos la ejecución de esta página PHP.
sleep(2);
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest) {
// El navegador implementa la interfaz XHR de forma nativa
- 11 -
Tema 7 Diseño Web en Entorno Cliente
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion) {
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
- 12 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
alert("Comenzamos la petición AJAX");
En esta función se realiza una petición AJAX, pero de forma asíncrona. En dicha petición se realiza la
carga del fichero indicado en la url (debe ser un fichero perteneciente al mismo DOMinio del
servidor). La respuesta ( responseText ), que obtenemos en esa petición, se coloca en un DIV, con la
función personalizada textoDIV (su código fuente está en el fichero funciones.js ). Si ejecutas el
ejemplo anterior, verás que no se muestra nada, ya que no hemos gestionado correctamente la
respuesta recibida de forma asíncrona. En el siguiente apartado 2, de esta unidad, veremos cómo
corregir ese fallo y realizar correctamente esa operación.
- 13 -
Tema 7 Diseño Web en Entorno Cliente
En el apartado 1.3.3., hemos visto un ejemplo de una petición asíncrona al servidor, pero vimos que
éramos incapaces de mostrar correctamente el resultado en el contenedor resultados .
Si ejecutas el ejemplo del apartado 1.3.3., verás que no se muestra nada en el contenedor
resultados, y la razón es porque, cuando accedemos a la propiedad miXHR.responseText , ésta no
contiene nada. Eso es debido a la solicitud asíncrona. Si recuerdas, cuando hicimos el ejemplo con
una solicitud síncrona, se mostró la alerta de "Comenzamos la petición AJAX", aceptaste el mensaje,
y justo 2 segundos después recibimos la alerta de "Terminó la petición AJAX". En el modo síncrono,
el navegador cuando hace la petición al servidor, con el método miXHR.send() , se queda esperando
hasta que termine la solicitud (y por lo tanto nosotros no podemos hacer otra cosa más que esperar
ya que el navegador está bloqueado). Cuanto termina la solicitud, pasa a la siguiente
línea: textoDIV(objeto,....) , y por tanto ya puede mostrar el contenido de responseText .
En el modo asíncrono, cuando aceptamos la primera alerta, prácticamente al instante se nos muestra
la siguiente alerta. Esto es así, por que el navegador en una petición asíncrona, no espera a que
termine esa solicitud, y continúa ejecutando las siguientes instrucciones. Por eso, cuando se hace la
llamada con el método miXHR.send() , dentro de la función cargarAsync() , el navegador sigue
ejecutando las dos instrucciones siguientes, sin esperar a que termine la solicitud al servidor. Y es por
eso que no se muestra nada, ya que la propiedad responseText , no contiene ningún resultado
todavía, puesto que la petición al servidor está todavía en ejecución. ¿Cuál será entonces la
solución?
Una primera solución que se nos podría ocurrir, sería la de poner un tiempo de espera o retardo,
antes de ejecutar la instrucción textoDIV . Esto, lo único que va a hacer, es bloquear todavía más
nuestro navegador, y además, tampoco sabemos exactamente lo que va a tardar el servidor web en
procesar nuestra solicitud.
- 14 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
La segunda solución, consistiría en detectar cuándo se ha terminado la petición AJAX, y es entonces
en ese momento, cuando accederemos a la propiedad responseText para coger los resultados. Ésta
será la solución, que adoptaremos y que veremos en el apartado 2.1 de esta unidad.
Cuando dicha petición termina, tendremos que comprobar cómo lo hizo, y para ello evaluamos la
propiedad status que contiene el estado devuelto por el servidor: 200 : OK, 404 : Not Found, etc.
Si status fue OK ya podremos comprobar, en la propiedad responseText o responseXML del objeto
XHR, los datos devueltos por la petición.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.1 - AJAX ASINCRONO</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Esta solicitud tardará 2 segundos aproximadamente, que es el tiempo de ejecución de la
página PHP en el servidor<br/><br/>
Contenedor resultados:<div id="resultados"></div>
Estado de las solicitudes:
<div id="estado"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
alert("Comenzamos la petición AJAX");
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
- 15 -
Tema 7 Diseño Web en Entorno Cliente
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
switch(this.readyState){
// Evaluamos el estado de la petición AJAX
// Vamos mostrando el valor actual de readyState en cada llamada.
case 0: document.getElementById('estado').innerHTML += "0 - Sin iniciar.<br/>";
break;
case 1: document.getElementById('estado').innerHTML += "1 - Cargando.<br/>";
break;
case 2: document.getElementById('estado').innerHTML += "2 - Cargado.<br/>";
break;
case 3: document.getElementById('estado').innerHTML += "3 - Interactivo.<br/>";
break;
case 4: document.getElementById('estado').innerHTML += "4 - Completado.";
if (this.status == 200){
// Si el servidor ha devuelto un OK
// Escribimos la respuesta recibida de la petición AJAX en el objeto DIV
textoDIV(document.getElementById("resultados"), this.responseText);
alert("Terminó la petición AJAX");
}
break;
}
}
fecha.php
<?php
// Para que el navegador no haga cache de los datos devueltos por la página PHP.
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest) {
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject) {
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
- 16 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
Más información sobre gestión de errores en:
http://www.javascriptkit.com/javatutors/trycatch2.shtml
*/
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion) {
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url usando una petición AJAX de forma
// ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
alert("Comenzamos la petición AJAX");
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
- 17 -
Tema 7 Diseño Web en Entorno Cliente
function estadoPeticion(){
switch(this.readyState){
// Evaluamos el estado de la petición AJAX
// Vamos mostrando el valor actual de readyState en cada llamada.
case 0: document.getElementById('estado').innerHTML += "0 - Sin iniciar.<br/>";
break;
case 1: document.getElementById('estado').innerHTML += "1 - Cargando.<br/>";
break;
case 2: document.getElementById('estado').innerHTML += "2 - Cargado.<br/>";
break;
case 3: document.getElementById('estado').innerHTML += "3 - Interactivo.<br/>";
break;
case 4: document.getElementById('estado').innerHTML += "4 - Completado.";
if (this.status == 200){
// Si el servidor ha devuelto un OK
// Escribimos la respuesta recibida de la petición AJAX en el objeto DIV
textoDIV(document.getElementById("resultados"), this.responseText);
alert("Terminó la petición AJAX");
}
break;
}
}
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.2 - AJAX ASINCRONO</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Esta solicitud tardará 2 segundos aproximadamente, que es el tiempo de ejecución de la
página PHP en el servidor<br/><br/>
Contenedor resultados:<div id="resultados"></div>
<div id="indicador"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
- 18 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
// Activamos el indicador Ajax antes de realizar la petición.
document.getElementById("indicador").innerHTML="<img src='ajax-loader.gif'/>";
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
// Haremos la comprobación en este orden ya que primero tiene que llegar readyState==4
// y por último se comprueba el status devuelto por el servidor==200.
if ( this.readyState==4 && this.status == 200 ) {
// Desactivamos el indicador AJAX.
document.getElementById("indicador").innerHTML="";
fecha.php
<?php
// Para que el navegador no haga cache de los datos devueltos por la página PHP.
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
- 19 -
Tema 7 Diseño Web en Entorno Cliente
http://www.javascriptkit.com/javatutors/trycatch2.shtml
*/
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
ajax-loader.gif
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
// Activamos el indicador AJAX.
document.getElementById("indicador").innerHTML="<img src='AJAX-loader.gif'/>";
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
- 20 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
// Haremos la comprobación en este orden ya que primero tiene que llegar readyState==4
// y por último se comprueba el status devuelto por el servidor==200.
if ( this.readyState==4 && this.status == 200 ){
// Desactivamos el indicador AJAX.
document.getElementById("indicador").innerHTML="";
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.3 - AJAX ASINCRONO GET - POST</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Contenedor resultados:<div id="resultados"></div>
<div id="indicador"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
// Activamos el indicador Ajax antes de realizar la petición.
document.getElementById("indicador").innerHTML="<img src='ajax-loader.gif'/>";
- 21 -
Tema 7 Diseño Web en Entorno Cliente
miXHR.onreadystatechange = estadoPeticion;
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
// Haremos la comprobación en este orden ya que primero tiene que llegar readyState==4
// y por último se comprueba el status devuelto por el servidor==200.
if ( this.readyState==4 && this.status == 200 ){
// Desactivamos el indicador AJAX.
document.getElementById("indicador").innerHTML="";
procesar.php
<?php
// Para que el navegador no haga cache de los datos devueltos por la página PHP.
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
- 22 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
// Activamos el indicador AJAX antes de realizar la petición.
document.getElementById("indicador").innerHTML="<img src='AJAX-loader.gif'/>";
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
- 23 -
Tema 7 Diseño Web en Entorno Cliente
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
// Haremos la comprobación en este orden ya que primero tiene que llegar readyState==4
// y por último se comprueba el status devuelto por el servidor==200.
if ( this.readyState==4 && this.status == 200 ){
// Desactivamos el indicador AJAX.
document.getElementById("indicador").innerHTML="";
En la petición GET , los parámetros que pasemos en la solicitud, se enviarán formando parte de la URL.
Por ejemplo: procesar.php?nombre=Teresa&apellidos=Blanco Ferreiro . Cuando realizamos la petición
por el método GET , te recordamos una vez más, que pondremos null como parámetro del
método send , ya que los datos son enviados a la página procesar.php, formando parte de la
URL: send(null) .
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.3 - AJAX ASINCRONO GET - POST</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Contenedor resultados:<div id="resultados"></div>
<div id="indicador"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarASync: carga el contenido con los parametros
// que se le vana a pasar a la petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(parametros){
if (miXHR){
// Activamos el indicador Ajax antes de realizar la petición.
- 24 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
document.getElementById("indicador").innerHTML="<img src='ajax-loader.gif'/>";
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada en cada cambio de estado de la petición.
// Cuando el estado de la petición(readyState) ==4 quiere decir que la petición ha terminado.
// Tendremos que comprobar cómo terminó(status): == 200 encontrado, == 404 no encontrado, etc.
// A partir de ese momento podremos acceder al resultado en responseText o responseXML
/////////////////////////////////////////////////////////
function estadoPeticion(){
// Haremos la comprobación en este orden ya que primero tiene que llegar readyState==4
// y por último se comprueba el status devuelto por el servidor==200.
if ( this.readyState==4 && this.status == 200 ){
// Desactivamos el indicador AJAX.
document.getElementById("indicador").innerHTML="";
procesar.php
<?php
// Para que el navegador no haga cache de los datos devueltos por la página PHP.
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
- 25 -
Tema 7 Diseño Web en Entorno Cliente
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarASync: carga el contenido con los parametros
// que se le vana a pasar a la petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(parametros){
if (miXHR){
// Activamos el indicador AJAX antes de realizar la petición.
document.getElementById("indicador").innerHTML="<img src='AJAX-loader.gif'/>";
- 26 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
miXHR.open('POST', "procesar.php", true); // Abrimos la url, true=ASINCRONA
En este ejemplo, tuvimos que realizar los siguientes cambios para adaptarlo al método POST :
La función cargarAsync() , recibirá los parámetros por POST en lugar de GET .
El método .open se modifica por:
miXHR.open('POST', "procesar.php", true);
Tenemos que crear una cabecera con el tipo de contenido que vamos a enviar, justo antes de
enviar la petición con el método .send() :
miXHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
En el método .send() escribiremos los parámetros ( nombre=Teresa&apellidos=Blanco Ferreiro )
que serán enviados por el método POST :
miXHR.send(parametros.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.3 - AJAX ASINCRONO GET - POST</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Contenedor resultados:<div id="resultados"></div>
<div id="indicador"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
- 27 -
Tema 7 Diseño Web en Entorno Cliente
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada a cada cambio de estado de la petición AJAX
// cuando la respuesta del servidor es 200(fichero encontrado) y el estado de
// la solicitud es 4, accedemos a la propiedad responseText
/////////////////////////////////////////////////////////
function estadoPeticion(){
if (this.readyState==4 && this.status == 200) {
// Almacenamos el fichero XML en la variable datos.
var datos=this.responseXML;
// Tenemos que recorrer el fichero XML empleando los métodos del DOM
// Array que contiene todos los CD's del fichero XML
CDs= datos.documentElement.getElementsByTagName("CD");
try{
// Intentamos imprimir el contenido de ese elemento
salida+="<td>" + titulos[0].firstChild.nodeValue + "</td>";
}catch (er){
// En el caso de que no tenga contenido ese elemento, imprimimos un espacio en
blanco
salida+= "<td> </td>";
}
// Cerramos la fila.
salida+="</tr>";
- 28 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
}
datosxml.php
<?php
// Para que el navegador no haga cache de los datos devueltos por la página PHP.
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
- 29 -
Tema 7 Diseño Web en Entorno Cliente
<TITLE>Sylvias Mother</TITLE>
<ARTIST></ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR></YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
- 30 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
- 31 -
Tema 7 Diseño Web en Entorno Cliente
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>";
echo $ficheroxml;
?>
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest) {
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
- 32 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
catalogo.xml
<?xml version="1.0" encoding="utf-8"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
- 33 -
Tema 7 Diseño Web en Entorno Cliente
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
- 34 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>
En la función iniciar() , le hemos dicho que cargue de forma asíncrona, empleando el método GET ,
el fichero datosXML.php . Esta aplicación PHP, nos devolverá un fichero XML, con una lista de Cd de
música con el artista, país, compañía, etc.
- 35 -
Tema 7 Diseño Web en Entorno Cliente
En nuestro caso, lo primero que vamos a hacer es recorrer los elementos, que son los que contienen
toda la información referente a los cd's de música:
// Almacenamos el fichero XML en la variable resultados.
resultados=this.responseXML;
// Tenemos que recorrer el fichero XML empleando los métodos del DOM
// Array que contiene todos los CD's del fichero XML
CDs= resultados.documentElement.getElementsByTagName("CD");
Haremos un bucle para recorrer todos los cd's del catálogo, y dentro de cada uno, imprimiremos los
datos que nos interesen:
// Hacemos un bucle para recorrer todos los elementos CD.
for (i=0;i<CDs.length;i++){
…..
Dentro de cada CD, accederemos al elemento que nos interese e imprimiremos su contenido. Para
imprimir el contenido de cada nodo, tendremos que hacerlo con el comando try { } catch {} , ya
que si intentamos acceder a un nodo que no tenga contenido, nos dará un error de JavaScript,
puesto que el elemento hijo no existe, y entonces se detendrá la ejecución de JavaScript y no
imprimirá nuestro listado.
// Para cada CD leemos el título
titulos=CDs[i].getElementsByTagName("TITLE");
try{
// Intentamos acceder al contenido de ese elemento
salida+="<td>" + titulos[0].firstChild.nodeValue + "</td>";
}catch (er){
// En el caso de que no tenga contenido ese elemento imprimimos un espacio en blanco.
salida+= "<td> </td>";
}
Arrays
Se pueden crear con corchetes:
var Beatles = ["Paul","John","George","Ringo"];
- 36 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
var Beatles = { "Paul","John","George","Ringo");
Objetos
Un objeto literal se puede crear entre llaves: { propiedad1:valor, propiedad2:valor,
propiedad3:valor}
var Beatles = {
"Country" : "England",
"YearFormed" : 1959,
"Style" : "Rock'n'Roll"
}
Beatles.Country = "England";
Beatles.YearFormed = 1959;
Beatles.Style = "Rock'n'Roll";
Y los arrays literales podrán contener objetos literales a su vez: {…} , {...}
var Rockbands =
[
{ "Name" : "Beatles", "Country" : "England", "YearFormed" : 1959, "Style" : "Rock'n'Roll",
"Members" :
["Paul","John","George","Ringo"] } , { "Name" : "Rolling Stones", "Country" : :England",
"YearFormed" : 1962, "Style" : "Rock'n'Roll", "Members" : ["Mick","Keith","Charlie","Bill"]
}
]
La sintaxis de JSON es como la sintaxis literal de un objeto, excepto que, esos objetos no pueden ser
asignados a una variable. JSON representará los datos en sí mismos. Por lo tanto el objeto
Beatles que vimos antes se definiría de la siguiente forma:
{
"Name" : "Beatles",
"Country" : "England",
"YearFormed" : 1959,
"Style" : "Rock'n'Roll",
"Members" : ["Paul","John","George","Ringo"]
}
Una cadena JSON es, simplemente, una cadena de texto, y no un objeto en sí misma. Necesita ser
convertida a un objeto antes de poder ser utilizada en JavaScript. Ésto se puede hacer con la
función eval() de JavaScript y también se pueden usar lo que se conoce como analizadores JSON,
que facilitarán esa conversión.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
- 37 -
Tema 7 Diseño Web en Entorno Cliente
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ejemplo dwec07 - 2.7 - JSON Ajax asíncrono</title>
<script type="text/javascript" src="funciones.js"></script>
<script type="text/javascript" src="index.js"></script>
<style>
#resultados{
background: yellow;
}
</style>
</head>
<body>
A continuación se cargarán por AJAX los datos recibidos en la solicitud ASINCRONA:<br/>
Contenedor resultados:<div id="resultados"></div>
<div id="indicador"></div>
</body>
</html>
index.js
////////////////////////////////////////////////////////////////////
// Cuando el documento esté cargado llamamos a la función iniciar().
////////////////////////////////////////////////////////////////////
crearEvento(window,"load",iniciar);
/////////////////////////////////////////////////////////
function iniciar(){
// Creamos un objeto XHR.
miXHR = new objetoXHR();
/////////////////////////////////////////////////////////
// Función cargarAsync: carga el contenido de la url
// usando una petición AJAX de forma ASINCRONA.
/////////////////////////////////////////////////////////
function cargarAsync(url){
if (miXHR){
// Activamos el indicador Ajax antes de realizar la petición.
document.getElementById("indicador").innerHTML="<img src='ajax-loader.gif'/>";
// Hacemos la petición al servidor. Como parámetro: null ya que los datos van por GET
miXHR.send(null);
}
}
/////////////////////////////////////////////////////////
// Función estadoPeticion: será llamada a cada cambio de estado de la petición AJAX
// cuando la respuesta del servidor es 200(fichero encontrado) y el estado de
// la solicitud es 4, accedemos a la propiedad responseText
/////////////////////////////////////////////////////////
function estadoPeticion(){
if (this.readyState==4 && this.status == 200){
// Los datos JSON los recibiremos como texto en la propiedad this.responseText
// Con la función eval() evaluaremos ese resultado para convertir a objetos y variables
el string que estamos recibiendo en JSON.
// Lo que recibimos en formato JSON es un string que representa un array [ ... ] que
contiene objetos literales {...},{...},...
/* Ejemplo: [ {"id":"2","nombrecentro":"IES A
Piringalla","localidad":"Lugo","provincia":"Lugo","telefono":"982212010","fechavisita":"2010-
11-26","numvisitantes":"85"} , {"id":"10","nombrecentro":"IES As Fontiñas","localidad" : .....
} ] */
- 38 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
var resultados=eval( '(' +this.responseText+')');
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
- 39 -
Tema 7 Diseño Web en Entorno Cliente
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
datosjson.php
<?php
// Cabecera para indicar que vamos a enviar datos JSON y que no haga caché de los datos.
header('Content-Type: application/json');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
/*
Utilizar el fichero dbcreacion.sql incluído en la carpeta para crear la base de datos,
usuario y tabla en tu servidor MySQL.
Si fuera necesario modifica los datos de la configuración y adáptalos a tu entorno
de trabajo.
*/
/*
O si queremos enviar como resultado un array de objetos literales llamado
- 40 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
resultados, haremos:
resultados = [{"id":"2","nombrecentro":"IES A
Piringalla","localidad":"Lugo","provincia":"Lugo","telefono":"982212010","fechavisita":"2010-
11-26","numvisitantes":"85"} , {"id":"10","nombrecentro":"IES As Fontiñas","localidad" : .....
}]
mysql_close($conexion);
?>
dbcreacion.sql
CREATE USER 'ajax'@'localhost' IDENTIFIED BY 'dwec';
use `ajax`;
--
-- Volcar la base de datos para la tabla `centros`
--
catalogo.xml
<?xml version="1.0" encoding="utf-8"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
- 41 -
Tema 7 Diseño Web en Entorno Cliente
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
- 42 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
- 43 -
Tema 7 Diseño Web en Entorno Cliente
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>
Si quieres probar el ejemplo, necesitas un servidor web, PHP
y MySQL. Puedes instalarte por ejemplo XAMPP en cualquiera
de sus versiones para Windows o Linux.
Nuestra aplicación de JavaScript recibe, por AJAX, esos datos, en la propiedad responseText . Para
poder utilizar directamente esos datos en JavaScript, lo que tenemos que hacer es evaluar la
expresión (cadena de texto, que recibimos de la página datosJSON.php ). La expresión JSON contenía
- 44 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
un array de objetos literales, por lo que tenemos que crear una variable, para asignar ese array y
poder recorrerlo.
// Hacemos un bucle para recorrer todos los objetos literales recibidos en el array resultados
y mostrar su contenido.
for (var i=0; i < resultados.length; i++){
objeto = resultados[i];
texto+="<tr><td>"+objeto.nombrecentro+
"</td><td>"+objeto.localidad+"</td><td>"+
objeto.provincia+"</td><td>"+
objeto.telefono+"</td><td>"+
objeto.fechavisita +"</td><td>"+
objeto.numvisitantes+ "</td></tr>";
}
"Si vivir es durar, prefiero una canción de los Beatles a un Long Play de los Boston Pops. - Mafalda."
Quino, Joaquín Salvador Lavado
- 45 -
Tema 7 Diseño Web en Entorno Cliente
La programación con AJAX, es uno de los pilares de lo que se conoce como web 2.0, término que
incluye a las aplicaciones web que facilitan el compartir información, la interoperabilidad, el diseño
centrado en el usuario y la colaboración web. Ejemplos de la web 2.0, pueden ser las comunidades
web, los servicios web, aplicaciones web, redes sociales, servicios de alojamiento de vídeos, wikis,
blogs, mashup (página web o aplicación que usa y combina datos, presentaciones y funcionalidad procedentes de una o más fuentes
para crear nuevos servicios. El término implica integración fácil y rápida, usando a menudo APIs abiertos y fuentes de datos con el objetivo
de producir resultados enriquecidos combinando diferentes fuentes ), etc.
Otra de las ventajas que nos aportan este tipo de librerías, es la de la compatibilidad entre
navegadores (cross-browser). De esta forma tenemos un problema menos, ya que la propia librería
será capaz de crear la petición AJAX de una forma u otra, dependiendo del navegador que estemos
utilizando.
A principios del año 2008 Google liberó su API de librerías AJAX, como una red de distribución de
contenido y arquitectura de carga, para algunos de los frameworks más populares. Mediante esta
API se eliminan las dificultades a la hora de desarrollar mashups en JavaScript. Se elimina el problema
de alojar las librerías (ya que están centralizadas en Google), configurar las cabeceras de cache, etc.
Esta API ofrece acceso a las siguientes librerías Open Source, realizadas con JavaScript:
jQuery.
prototype.
scriptaculous.
mooTools.
dojo, swfobject, chrome-frame, webfont, etc.
Los scripts de estas librerías están accesibles directamente utilizando la URL de descarga, o a través
del método google.load() del cargador de la API AJAX de Google.
- 46 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
Hay muchísimas librerías que se pueden utilizar para programar AJAX, dependiendo del lenguaje que
utilicemos. Mira el siguiente anexo para comprobarlo
Nosotros nos vamos a centrar en el uso de la librería jQuery, por ser una de las más utilizadas hoy en
día por empresas como Google, DELL, digg, NBC, CBS, NETFLIX, mozilla.org, wordpress, drupal, etc.
jQuery nos puede ayudar muchísimo a solucionar todos esos problemas, ya que nos ofrece la
infraestructura necesaria para crear aplicaciones complejas en el lado del cliente. Basado en la
filosofía de "escribe menos y produce más", entre las ayudas facilitadas por este framework están: la
creación de interfaces de usuario, uso de efectos dinámicos, AJAX, acceso al DOM, eventos, etc.
Además esta librería cuenta con infinidad de plugins, que nos permitirán hacer presentaciones con
imágenes, validaciones de formularios, menús dinámicos, drag-and-drop, etc.
Esta librería es gratuita, y dispone de licencia para ser utilizada en cualquier tipo de plataforma,
personal o comercial. El fichero tiene un tamaño aproximado de 31 KB, y su carga es realmente
rápida. Además, una vez cargada la librería, quedará almacenada en caché del navegador, con lo que
el resto de páginas que hagan uso de la librería, no necesitarán cargarla de nuevo desde el servidor.
Para poder programar con jQuery, lo primero que tenemos que hacer es cargar la librería. Para ello,
podemos hacerlo de dos formas:
Cargando la librería directamente desde la propia web de jQuery con la siguiente instrucción:
<script type="text/javascript" src="HTTP://code.jquery.com/jquery-latest.js"></script>
De esta forma, siempre nos estaremos descargando la versión más actualizada de la librería. El único
inconveniente, es que necesitamos estar conectados a Internet para que la librería pueda
descargarse.
De esta forma, el fichero de la librería estará almacenado como un fichero más de nuestra aplicación,
por lo que no necesitaremos tener conexión a Internet (si trabajamos localmente), para poder usar la
librería. Para poder usar este método, necesitaremos descargarnos el fichero de la librería desde la
página de jQuery ( jquery.com ). Disponemos de dos versiones de descarga: la versión de
producción (comprimida para ocupar menos tamaño), y la versión de desarrollo (descomprimida).
Generalmente descargaremos la versión de producción, ya que es la que menos tamaño ocupa. La
versión de desarrollo tiene como única ventaja que nos permitirá leer, con más claridad, el código
fuente de la librería (si es que estamos interesados en modificar algo de la misma).
La clave principal para el uso de jQuery radica en el uso de la función $() , que es un alias
de jQuery() . Esta función se podría comparar con el clásico document.getElementById() , pero con una
- 47 -
Tema 7 Diseño Web en Entorno Cliente
diferencia muy importante, ya que soporta selectores CSS, y puede devolver arrays. Por lo
tanto $() es una versión mejorada de document.getElementById() .
Selectores CSS.
Anexo II - Selectores CSS que deberías conocer
Esta función $("selector") , acepta como parámetro una cadena de texto, que será un selector CSS,
pero también puede aceptar un segundo parámetro, que será el contexto en el cuál se va a hacer la
búsqueda del selector citado. Otro uso de la función, puede ser el de $(function){..}); equivalente
a la instrucción $(document).ready (function() {...}); que nos permitirá detectar cuando el DOM
está completamente cargado.
normal.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Ejemplo sin jQuery</title>
<style type="text/css">
.colorido{
background-color:#99FF33;
}
</style>
function iniciar(){
var tabla=document.getElementById("mitabla"); // Seleccionamos la tabla.
var filas= tabla.getElementsByTagName("tr"); // Seleccionamos las filas de la
tabla.
- 48 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
</tr>
<tr>
<td>Francia</td>
<td>58454545</td>
<td>45645</td>
</tr>
<tr>
<td>Uk</td>
<td>78799788</td>
<td>88547</td>
</tr>
<tr>
<td>USA</td>
<td>98878787</td>
<td>45124</td>
</tr>
</table>
</body>
</html>
jquery.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Ejemplo con jQuery</title>
<style type="text/css">
.colorido{
background-color:#99FF33;
}
</style>
- 49 -
Tema 7 Diseño Web en Entorno Cliente
funciones.js
/////////////////////////////////////////////////////////
// Función cross-browser para crear objeto XMLHttpRequest
/////////////////////////////////////////////////////////
function objetoXHR(){
if (window.XMLHttpRequest){
// El navegador implementa la interfaz XHR de forma nativa
return new XMLHttpRequest();
}else if (window.ActiveXObject){
var versionesIE = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
/*
Si llegamos aquí es porque el navegador no posee ninguna forma de crear el objeto.
Emitimos un mensaje de error usando el objeto Error.
/////////////////////////////////////////////////////////
// Función cross-browser para añadir Eventos
/////////////////////////////////////////////////////////
var crearEvento = function(){
function w3c_crearEvento(elemento, evento, mifuncion){
elemento.addEventListener(evento, mifuncion, false);
}
/////////////////////////////////////////////////////////
// Función cross-browser para modificar el contenido
// de un DIV
/////////////////////////////////////////////////////////
function textoDIV(nodo, texto){
//var nodo = document.getElementById(idObjeto);
while (nodo.firstChild)
nodo.removeChild(nodo.firstChild); // Eliminamos todos los hijos de ese objeto.
- 50 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
// Cuando ya no tenga hijos, agregamos un hijo con el texto que recibe la función.
nodo.appendChild(document.createTextNode(texto));
}
function iniciar(){
var tabla=document.getElementById("mitabla"); // Seleccionamos la tabla.
var filas= tabla.getElementsByTagName("tr"); // Seleccionamos las filas de la tabla.
- 51 -
Tema 7 Diseño Web en Entorno Cliente
type: [GET/POST],
success: [function callback exito(data)],
error: [function callback error],
complete: [function callback error],
ifModified: [bool comprobar E-Tag],
data: [mapa datos GET/POST],
async: [bool que indica sincronía/asincronia]
});
Por ejemplo:
$.AJAX({
url: '/ruta/pagina.php',
type: 'POST',
async: true,
data: 'parametro1=valor1¶metro2=valor2',
success: function (respuesta)
{
alert(respuesta);
},
error: mostrarError
});
El método .load()
Este método, es la forma más sencilla de obtener datos desde el servidor, ya que de forma
predeterminada, los datos obtenidos son cargados en el objeto al cuál le estamos aplicando el
método.
- 52 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
La función callback es opcional, y es ahí donde pondremos la función de retorno, que será llamada
una vez terminada la petición. En esa función realizaremos tareas adicionales, ya que la acción por
defecto de cargar en un objeto el contenido devuelto en la petición, la realiza el propio
método load() .
Ejemplos:
$("#noticias").load("feeds.HTML");
// carga en el contenedor con id noticias lo que devuelve la página feeds.HTML.
Cuando se envían datos en este método, se usará el método POST . Si no se envían datos en la
petición, se usará el método GET .
La función $.post()
Nos permite realizar peticiones AJAX al servidor, empleando el método POST . Su sintaxis es la
siguiente:
$.post( url, [datos], [callback], [tipo] )
Ejemplos:
$.post("test.php");
$.post("test.php", function(resultados) {
alert("Datos Cargados: " + resultados);
});
Para poder detectar estos errores, necesitamos herramientas que nos ayuden a encontrarlos. En la
programación con JavaScript, los errores los podemos detectar con el propio navegador. Por
ejemplo, en el navegador Firefox para abrir la consola de errores, lo podemos hacer desde el menú
Herramientas, o bien pulsando las teclas CTRL + Mayúsc. + J (en Windows). En la consola, se nos
mostrarán todos los errores que se ha encontrado durante la ejecución de la aplicación. En Internet
Explorer versión 9, podemos abrir la Herramienta de Desarrollo, pulsando la tecla F12. Desde esta
herramienta se pueden consultar los errores de JavaScript, activar los diferentes modos de
compatibilidad entre versiones de este navegador, deshabilitar CSS, JavaScript, etc.
- 53 -
Tema 7 Diseño Web en Entorno Cliente
Vamos a encontrar plugins en un montón de categorías: AJAX, animación y efectos, DOM, eventos,
formularios, integración, media, navegación, tablas, utilidades, etc.
Antes de poder usar cualquier plugin de jQuery, será necesario cargar primero la librería de jQuery, y
a continuación la librería del plugin que deseemos, por ejemplo:
<script type="text/javascript" src="HTTP://code.jquery.com/jquery-latest.js"></script>
Todos los plugins contienen documentación, en la que se explica cómo usar el plugin.
Desde la web oficial de jquery.com , puedes hojear todos los plugins disponibles para jQuery:
Plugins para jQuery. http://plugins.jquery.com/
También es muy común el encontrar páginas, en las que se muestran rankings de los
mejores plugins para jQuery. Algunos ejemplos pueden ser:
Los Mejores plugins jQuery del año 2011.
http://www.ajaxline.com/best-jquery-plugins-february-2011
Los 130 mejores plugins de jQuery.
http://pixelcurse.com/jquery/ultimate-roundup-of-best-jquery-plugins
Búsqueda en Google de los mejores plugins de jQuery.
http://www.google.es/#sclient=psy&hl=es&source=hp&q=best+jquery+plugins&aq=f&aqi
=g3&aql=&oq=&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=d64bad206e66ecae&biw=1920&bih=8
88
Y para terminar, te vamos a poner unos enlaces a unos vídeos hospedados en Youtube.com
- 54 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
- 55 -
Tema 7 Diseño Web en Entorno Cliente
- 56 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
DynAPI es una librería, de código abierto, en JavaScript para crear componentes Dinámicos para
HTML (DHTML) en una página web.
qooxdoo es una librería que ofrece muchas facilidades para crear interfaces javascript avanzados,
incluyendo una consola de depuración, manejo de eventos, control del foco… Soporta la mayoría
de los navegadores actuales y tiene licencia LGPL. (fuente)
Engine for Web Applications es un framework para desarrollo de aplicaciones web del lado del
cliente.
JavaScript Libraries sitio web donde podemos encontrar gran cantidad de utilidades/scripts en
JavaScript y DHTML, tales como: manejo de formularios, retención de variables, cargar/mostrar
imágenes, menús, efectos y entre otros como XML/RSS/DOM.
Javascript Toolbox es un repositorio de códigos y librerías reutilizables que satisfacer necesidades
comunes que enfrentan muchos desarrolladores web. La gran cantidad de estos código es
compatible con la mayoría de navegadores. Podemos encontrar códigos fiables, pues son
probados y testeados para un correcto funcionamiento. Excelente iniciativa realmente!.
Taconite es framework que simplifica la creación de aplicaciones web Ajax. Automatiza las
tediosas tareas relacionadas con Ajax, tales como la creación y gestión del objeto
XMLHttpRequest y la creación de contenido dinámico. Taconite se puede utilizar con todos los
navegadores web actuales (Firefox, Safari, Internet Explorer, Opera y Konqueror, por citar
algunos) y puede utilizarse con tecnologías del lado del servidor como Java EE, .Net, PHP ó
cualquier lenguaje que retorne como respuesta XHTML.
jQuery es un nuevo tipo de librerias de Javascript que permite simplificar la manera de
interactuar con los documentos HTML, permitiendo manejar eventos,desarrollar animaciones, y
agregar interacción con la tecnología AJAX a nuestras páginas web. jQuery esta diseñado para
cambiar la forma de escribir código JavaScript. (fuente)
JSL: JavaScript Standard Library es un único y pequeño archivo (7.7 KB) con funciones y métodos
estándar de JavaScript. Compatible con cualquier navegador que soporte al menos JavaScript 1.2.
DHTML Kitchen es un sitio web donde podemos encontrar muchos códigos/script e información
sobre DHTML.
liberty es una librería básica (simple) para desarrollo web con JavaScript. (fuente)
moo.fx es un librería Javascript liviana y pequeña (3KB) con la cual podemos conseguir unos
efectos muy interesantes. Trabaja con los frameworks Prototype y Mootools. Simple y fácil de
usar. Podemos controlar ó modificar las propiedades CSS y los elementos HTML.
overLIB es una librería JavaScript que nos permite mostrar una pequeña caja de información
(popup) sobre los enlaces ó link de nuestras páginas web. Brindan asó información a nuestros
usuarios sobre a donde nos llevan los links.
TurboWidgets son controles JavaScript del lado del cliente para proporcionan un agradable y
manejable interfaz de usuario para aplicaciones web estilo AJAX. Construido con Dojo Toolkit,
TurboWidgets están diseñados para un uso fácil.
overlibmws DHTML Popup Library es una librería DHTML, cuenta con documentación y muchos
ejemplos.
PlotKit - Javascript Chart Plotting librería en JavaScript para la creación de gráficos. Es soportado
por el elemento HTML Canvas, SVG y soporte nativo del navegador. Plokit cuenta con
documentación y ejemplos para hacer usarlo en nuestros proyectos sin inconvenientes.
qForms JavaScript API es uno de los más completas API JavaScript para la fácil creación y
manipulación de formularios en nuestro proyectos web.
Zapatec AJAX Suite te brinda una cantidad de herramientas para interfaces de usuarios en tus
aplicaciones web, como por ejemplo: calendarios, menús, explorador árbol, formularios, grid,
slider, tabs, drag-drgop, efectos y más.
Rico es una librería de efectos Ajax disponible en OpenRico que permite simplificar el desarrollo
de aplicaciones que utilicen esta tecnología. Mediante Rico es muy sencillo definir la operación
básica de Ajax: enviar una solicitud al servidor para que devuelva información. Dispone también
de algunos efectos gráficos, tablas actualizables y secciones de drag & drop. (fuente)
- 57 -
Tema 7 Diseño Web en Entorno Cliente
Sajax es una herramienta de código abierto diseñada para ayudar a los sitios web que usan AJAX
framework (también conocido como XMLHttpRequest). Permite al programador llamar a
funciones PHP, Perl o Python desde su página web por medio de JavaScript sin necesidad de
forzar una actualización de la página en el navegador. (fuente)
sardalya herramienta API la creación de páginas DHTML, diseñada para trabajar en todos los
navegadores que soportan DOM.
script.aculo.us es una librería JavaScript que permite el uso de controles AJAX, drag & drop, y
otros efectos visuales en una página web. Se distribuye mediante descargas en varios formatos
de archivo, y también está incluido en Ruby on Rails y otros frameworks de desarrollo web.
Spry Framework for Ajax es una librería JavaScript de Adobe que facilita el uso de funciones con
AJAX. Se encarga de manejar la complejidad interna del AJAX y permite al desarrollador crear
facilmente aplicaciones web 2.0.
Tacos librería que proporciona componentes AJAX para Tapestry (framework para el desarrollo
aplicaciones web en Java). Su funcionalidad está basada en el framework Dojo.
TwinHelix nos ofrece proyectos libres DHTML y JavaScript, aunque también XHTML, CSS y CGI.
Yahoo! User Interface Library es un paquete de utilidades y controles, escritos en JavaScript, que
facilitan la construcción de aplicaciones interactivas (RIA). [Tales como] Drag and drops,
animaciones, aplicaciones con Ajax, DOM, etc. Todas muy completas y fáciles de poner en
práctica (con pocas líneas de código). La finalidad de esta librería (y de ahí el nombre) es facilitar
el desarrollo de aplicaciones ricas del lado del cliente (usuario), logrando elementos visuales e
interactivos que incluyen CSS. (fuente)
Zebda es una librería en JavaScript para diversos propositos. Se basa en Prototype 1.4.0.
Zephyr es un framework para crear aplicaciones AJAX con PHP5. Puedes desarrollar fácilmente
aplicaciones empresariales utilizando este robusto framework. Es muy fácil de aprender y muy
sencillo de implementar.
ZK es un framework Ajax de código abierto que dispone de herramientas ó controles para crear
interfaces de usuarios similares a las de escritorio.
ext es un framework del lado del cliente para el desarrollo de aplicaciones web. Tiene un sistema
dual de licencia: Comercial y Opern Source. Este framework puede correr en cualquier
plataforma que pueda procesar POST y devolver datos estructurados (PHP, Java, .NET y algunas
otras). (fuente)
mootools es un framework JavaScript compacto y modular, orientado a objeto para la creación
de aplicaciones web compatible con cualquier navegador.
¿Cónoces de alguna otra librería ó framework para JavaScript, DHTML y AJAX?
Basado en AJAX, DHTML and JavaScript Libraries.
- 58 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
Para conseguir parte de estas mejoras, deberemos usar los llamados selectores, que en resumen son
una forma de permitirnos elegir un elemento (o varios) entre todos los que tenemos en nuestro
HTML. Similar al funcionamiento de las expresiones regulares para el texto, los selectores nos
permiten usar caracteres especiales para referirnos a un elemento o un rango de los mismos.
Selector Descripción
* Selector universal, son todos los elementos del CSS
E E representa cualquier elemento del tipo E ( span , p , …)
EF Todos los elementos F que sean descendentes de E
E>F Todos los elementos F que sean hijos de E
E:first-child De esta forma podemos seleccionar el primer elemento de tipo E
Selecciona los elementos E que sean un enlace y no hayan sido visitados
E:link , E:visited
( :link ) y los si visitados ( :visited )
E:active , E:hover , E:focus Selecciona los elementos de tipo E , en sus correspondientes acciones.
Cogemos los elementos del tipo E que estén en el idioma (humano)
E:lang(c)
especificado en (c) .
Se trata de cualquier elemento F inmediatamente después del elemento
E+F
del tipo E
E[foo] Elementos del tipo E con el atributo foo
E[foo="ejemplo"] Elementos del tipo E con el atributo foo igual a “ ejemplo ”
Elementos del tipo E con el atributo foo contenga “ ejemplo ”. Se pueden
E[foo~="ejemplo"]
añadir varias palabras separadas por espacios. ( ~ =ALT + 0126)
Similar al anterior, pero se referirá a todos los elemento E tal que su
E[lang|="es"]
atributo lang comienze por “ es ”. Por ejemplo: “ es_ES ”, “ es_CA ”,…
E[foo$="ejemplo"] Elementos del tipo E en el que el atributo foo termine con “ ejemplo ”.
DIV.ejemplo Todos los elementos DIV que sean de la clase ejemplo
E#miID El elemento E en el que su ID sea igual miID
:first-line
Se refiere a la primera línea del elemento, normalmente usado para elementos de texto.
p {font-size: 12pt}
p:first-line {color: #0000FF; font-variant: small-caps}
Propiedades:
font properties
color properties
background properties
word-spacing
letter-spacing
text-decoration
- 59 -
Tema 7 Diseño Web en Entorno Cliente
vertical-align
text-transform
line-height
clear
:first-letter
La primera letra del elemento, también suele usarse para elementos de texto.
p {font-size: 12pt}
p:first-letter {font-size: 200%; float: left}
Propiedades:
font properties
color properties
background properties
margin properties
padding properties
border properties
text-decoration
vertical-align (only if ‘float’ is ‘none’)
text-transform
line-height
float
clear
:before
Elemento usado para insertar algún contenido delante de un elemento.
h1:before { content: url(beep.wav) }
:after
Elemento usado para insertar algún contenido al final del elemento.
h1:after { content: url(beep.wav) }
Multiples pseudo-elementos
Además nos permite utilizar varios pseudo-elementos sobre un mismo elemento.
p {font-size: 12pt}
p:first-letter {color: #FF0000; font-size: 200%}
p:first-line {color: #0000FF}
Compatibilidad
Pseudo-elemento IE F N W3C
:first-letter 5 1 8 1
:first-line 5 1 8 1
:before 1.5 8 2
:after 1.5 8 2
- 60 -
DAW Modelo de objetos del documento en javascript. José Luis Comesaña
- 61 -
Tema 7 Diseño Web en Entorno Cliente
The jQuery library provides several techniques for adding animation to a web page. These include
simple, standard animations that are frequently used, and the ability to craft sophisticated custom
effects.
.animate()
Perform a custom animation of a set of CSS properties.
.clearQueue()
Remove from the queue all items that have not yet been run.
.delay()
Set a timer to delay execution of subsequent items in the queue.
.dequeue()
Execute the next function on the queue for the matched elements.
.fadeIn()
Display the matched elements by fading them to opaque.
.fadeOut()
Hide the matched elements by fading them to transparent.
.fadeTo()
Adjust the opacity of the matched elements.
.fadeToggle()
Display or hide the matched elements by animating their opacity.
.finish()
Stop the currently-running animation, remove all queued animations, and complete all animations
for the matched elements.
.hide()
Hide the matched elements.
jQuery.fx.interval
The rate (in milliseconds) at which animations fire.
jQuery.fx.off
Globally disable all animations.
.queue()
Show or manipulate the queue of functions to be executed on the matched elements.
.show()
Display the matched elements.
.slideDown()
Display the matched elements with a sliding motion.
.slideToggle()
Display or hide the matched elements with a sliding motion.
.slideUp()
Hide the matched elements with a sliding motion.
.stop()
Stop the currently-running animation on the matched elements.
.toggle()
Display or hide the matched elements.
- 62 -