Programación en
JavaScript
Gonzalo Álvarez Marañón
Instituto de
Física Aplicada, CSIC
www.iec.csic.es/criptonomicon
Resumen
JavaScript es la forma más sencilla de
crear una animación y hacer operaciones básicas en una página web normal. En
este curso se aprenderá cómo crear elementos que mejoran la interacción con el
cliente; elementos que mejoran la visualización o la imagen de una página;
cálculos matemáticos sencillos sobre variables para cálculo de presupuestos o
conversiones automáticas; menús con una presentación de mayor nivel, manejando
imágenes de forma dinámica; cookies y otros interesantes efectos.
1. Introducción
JavaScript es un lenguaje de
programación desarrollado por Netscape Corporation para su navegador Netscape
Navigator 2.0, cuya finalidad es permitir la ejecución de código dentro de las
páginas en HTML. Microsoft posee su propia versión para su navegador Internet
Explorer, llamada JScript, pero que, salvo en algunos detalles generalmente no
demasiado importantes, resulta compatible con los navegadores de Netscape.
Gracias a los programas (llamados guiones) escritos en este lenguaje y embebidos
en las páginas HTML, se pueden conseguir interesantes efectos en las páginas
web, comprobar la validez de la entrada de formularios, abrir y cerrar ventanas,
cambiar dinámicamente el aspecto y los contenidos de una página, realizar
cálculos matemáticos sencillos y mucho más.
En este curso se pretende ofrecer una
introducción al lenguaje JavaScript, que dote a sus lectores del conocimiento y
herramientas necesarios para empezar inmediatamente a utilizar con eficacia
guiones en sus páginas y mejorar así su contenido. Se ofrecerán ejemplos
continuamente, junto con su código fuente, que puede ser tomado como punto de
arranque para desarrollar nuevas aplicaciones. Si desea obtener una guía
completa sobre este lenguaje, se recomienda al lector acudir a la página de
Netscape:
developer.netscape.com/docs/manuals/communicator/jsguide4/index.htm
Las personas que ya estén
familiarizadas con HTML y especialmente con los lenguajes de programación C/C++
o Java, no encontrarán ninguna dificultad en seguir estas lecciones, ya que
JavaScript les resultará muy familiar. Se trata de un lenguaje interpretado (no
compilado) por el navegador del usuario, lo que significa que el código se va
ejecutando a medida que se carga la página web. Está basado en objetos, aunque
no emplea clases ni herencia, típicas de la Programación Orientada a Objetos. En
la Fig. 1 se muestra cuáles son los objetos que incorpora
JavaScript.

Fig. 1. Jerarquía de objetos en JavaScript.
Teniendo en cuenta que el código
JavaScript se ejecuta automáticamente en el ordenador del usuario cuando éste
visita una página web, es necesario imponerle por diseño una serie de
limitaciones, cuyo cometido principal es prevenir que se altere el sistema de
ficheros del cliente, por lo que no puede leer, escribir, crear, borrar o listar
ficheros (excepto cookies, de las que se hablará en la sección 8). Carece además
de primitivas de red, de manera que no puede establecer una conexión directa con
otras máquinas (excepto enviar correo).
El presente curso es una versión en
Word de las páginas que pueden encontrarse en:
www.iec.csic.es/criptonomicon/javascript
2. Cómo añadir JavaScript a una
página
Existen diversos métodos para añadir
guiones y funciones en JavaScript a una página web convencional. En este curso
se describirán las tres siguientes:
2.1 Mediante la etiqueta
<SCRIPT>
Constituye la forma estándar de incluir
funciones escritas en JavaScript:
<SCRIPT LANGUAGE="JavaScript">
<!--
Aquí iría incluido el código en
JavaScript
//-->
</SCRIPT>
Cuando el navegador va
interpretando la página en HTML, al llegar a esta etiqueta sabe que lo que está
encerrado entre <SCRIPT> y </SCRIPT> constituye código JavaScript y
lo ejecutará como corresponda. Cuando se crean funciones y variables que se
utilizan en varios puntos de la página web, se suelen definir al principio de la
página, entre las etiquetas <HEAD>.
2.2 Como un URL
También se pueden incluir
sentencias de JavaScript, como argumentos de la etiqueta HREF, que serán
evaluadas dinámicamente cuando el usuario pinche sobre un enlace o simplemente
pase el ratón sobre él.
2.3 En
respuesta a eventos
Los eventos disparan acciones
programadas en JavaScript dentro de la página HTML como resultado de alguna
acción del usuario, como pulsar un botón o deslizar el ratón sobre una
imagen.
Más adelante, a medida que se vaya
avanzando, se desarrollarán varios ejemplos de los tres métodos
citados.
3. Abriendo y cerrando
ventanas
Todo programador que se precie, cuando
se adentra en un nuevo lenguaje, escribe siempre un primer programa que produce
una salida con un saludo al mundo. En JavaScript existen varias formas de
hacerlo, con diversos niveles de sofisticación. El más sencillo consiste en
crear una ventana de alerta con el mensaje deseado:
alert( "¡Hola, mundo!" );
Si esta sentencia se incluye
entre las etiquetas <SCRIPT> en cualquier lugar de una página web, se
presentará una ventana con el mensaje "¡Hola, mundo!" (Fig. 2). Pulsando en el
botón de Aceptar, se cerrará, sin afectar al contenido del resto de la
página.

Fig. 2. Ventana de alerta.
También puede añadirse como
atributo de la etiqueta HREF, de manera que aparezca la ventana al seguir un
enlace:
Quiero ver la <a
href="javascript:alert('Hola, mundo');">ventana</a>.
Por último, se puede hacer que al
pulsar un botón presente en la página web (es decir, en respuesta al evento
onClick del botón), aparezca igualmente la consabida ventana:
<input type="button" value="Mostrar
ventana" onClick="alert('¡Hola, mundo!');">
Además de las ventanas de alerta,
JavaScript proporciona otros dos tipos más, que permiten interactuar con el
visitante:
- prompt presenta una ventana con un mensaje y
un recuadro de texto donde el usuario introduce aquello que se le pide (Fig.
3). La cadena tecleada por el usuario puede almacenarse en una variable para
su uso futuro.
nombre = prompt('Introduce tu nombre',
'Desconocido');

Fig. 3. Ventana para introducción de datos.
- confirm presenta una ventana con un mensaje
y dos botones, Aceptar y Cancelar, que el usuario pulsará en función del
contenido del mensaje (Fig. 4). Si el usuario pulsa Aceptar, confirm devuelve
un valor Verdadero (TRUE), mientras que si pulsa Cancelar, devuelve un valor
Falso (FALSE), que puede ser utilizado por el guión en JavaScript para decidir
que acción ejecutar a continuación.
if (confirm('¿Desea continuar?'))
// se ejecuta una acción
else
// se ejecuta otra

Fig. 4. Ventana de confirmación.
También es posible abrir nuevas
ventanas del navegador con el método open del objeto window:
nuevaVentana=window.open("ventananav.html");
donde nuevaVentana es el
identificador de un nuevo objeto window que identifica a la ventana recién
creada, en la que se habrá cargado la página ventananav.html. Algunos de los
parámetros que se pueden controlar al abrir la nueva ventana, cuyos posibles
valores pueden ser yes o no, son:
- directories: si su valor es yes, crea los
botones de directorio estándar del navegador, tales como What's New y
What's Cool en Netscape.
- height: especifica la altura en pixels de la
ventana creada.
- menubar: si su valor es yes, crea una barra
de menú en la parte superior de la ventana.
- resizable: si su valor es yes, permite al
usuario cambiar el tamaño de la ventana.
- scrollbars: si su valor es yes, crea barras
de desplazamiento vertical y horizontal cuando el tamaño del documento sea
mayor que el de la ventana.
- status: si su valor es yes, crea una barra
de estado en la parte inferior de la ventana.
- toolbar: si su valor es yes, crea una barra
de herramientas estándar con botones.
- width: especifica la anchura en pixels de la
ventana creada.
A su vez, las ventanas se pueden cerrar
utilizando cualquiera de los siguientes tres
métodos:
window.close()
self.close()
close()
Eso sí, el último de ellos no debe
usarse en un gestor de eventos. Así, por ejemplo, para cerrar la ventana
anterior, podría hacerse:
nuevaVentana.close();
4. Escribir en la ventana
actual
Ahora que se ha visto cómo abrir y
cerrar ventanas, se procederá a explicar cómo escribir texto de manera dinámica
dentro de una página web.
Como ya se dijo, JavaScript es un
lenguaje basado en objetos, siendo el objeto window, visto ya en la sección
anterior, el que se encuentra a la raíz de todos ellos (Fig. 1). Por debajo de
él se encuentran todos los demás, como el objeto document, que contiene
información sobre el documento actual y proporciona los métodos o funciones que
permiten mostrar una salida al usuario. En concreto, el método write escribe una
o más expresiones HTML en un documento en la ventana
especificada.
Por ejemplo, para escribir el mensaje
"¡Hola, mundo!" dentro de la página web bastaría con utilizar la siguiente línea
de código:
document.write( "¡Hola, mundo!" );
en el lugar en el que se quisiera
que apareciera el mensaje (por supuesto, encerrada entre las etiquetas
<SRIPT>, como ya se explicó).
Evidentemente, escribir directamente el
texto de esta forma no presenta ninguna ventaja respecto a utilizar una línea
convencional en HTML. La verdadera utilidad radica en poder utilizar variables y
funciones de manera que el texto cambie dinámicamente. A continuación se verán
dos ejemplos: cómo incluir información sobre el navegador del usuario y cómo
incluir la fecha.
4.1 Cómo escribir datos del
usuario
El objeto navigator posee
propiedades o variables para almacenar el nombre y versión del navegador usado,
los tipos MIME soportados por el cliente y los plug-in instalados en el
cliente. La propiedad appName contiene el nombre del navegador, mientras que la
propiedad appVersion almacena información sobre su versión. Usando estas
propiedades se le puede mandar al usuario un mensaje indicándole el navegador
que usa y su versión:
document.write( "Utilizas el navegador
" + navigator.appName + ", versión " + navigator.appVersion + "." );
La utilidad de estas funciones radica
sobre todo en la posibilidad de mostrar la página de una manera u otra en
función del tipo y versión del navegador del usuario.
4.2 Cómo escribir la fecha
actual
Es muy común encontrarse la fecha del
día en páginas web de periódicos y otros servicios de información. En lugar de
tener que escribirla y cambiarla manualmente cada día a las 00.00, resulta mucho
más cómodo y eficiente escribir un sencillo guión que se encargue
automáticamente de la tarea.
Para gestionar fechas y horas se
utiliza el objeto Date. Cuando no se le proporcionan argumentos a su
constructor, éste devuelve la fecha y hora en el momento en que se le
invocó:
ahora = new Date();
almacenándose la fecha y hora
actuales en ahora. Se puede acceder a los distintos componentes de la fecha y
hora por medio de métodos como los siguientes:
- getDate: devuelve el día del mes (valor
entero entre 1 y 31) para la fecha especificada.
- getDay: devuelve el día de la semana (0 para
Domingo, 1 para Sábado, etc.) para la fecha especificada.
- getHours: devuelve la hora (valor entero
entre 0 y 23) para la fecha especificada.
- getMinutes: devuelve los minutos (valor
entero entre 0 y 59) para la fecha especificada.
- getMonth: devuelve el mes (valor entero
entre 0 y 11) para la fecha especificada.
- getSeconds: devuelve los segundos (valor
entero entre 0 y 59) para la fecha especificada.
- getTime: devuelve un valor numérico (número
de milisegundos transcurridos desde el 1 de enero de 1970 a las 00.00)
correspondiente a la hora para la fecha especificada.
- getYear: devuelve el año para la fecha
especificada.
Utilizando estos métodos, se puede
construir una función que devuelva la fecha actual:
function fechahoy() {
var diasemana = new Array('Domingo',
'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');
var nombremes = new Array('enero',
'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre',
'octubre', 'noviembre', 'diciembre');
var ahora;
var fecha = new Date();
var anio = fecha.getYear();
var mes = fecha.getMonth();
var dia = fecha.getDay();
var num = fecha.getDate();
ahora = diasemana[dia] + ", " + num + "
" + nombremes[mes] + " " + anio;
return ahora;
}
Esta función devuelve una cadena
con el día de la semana, seguido del día del mes, el mes y el año. La función se
puede invocar en cualquier lugar de la página web y presentar su salida
utilizando el método write del objeto document:
document.write( "Hoy es " + fechahoy()
);
5. Cómo validar
formularios
Los formularios representan una forma
rápida y eficaz de enviar información desde el ordenador del usuario hasta el
servidor web. Generalmente, constan de varios campos de texto, botones de
selección y listas desplegables, que el usuario rellena convenientemente y
transmite al servidor pulsando finalmente en un botón de envío. A menudo, muchos
de los campos que el usuario debe completar obedecen a un formato determinado,
por lo que conviene que el usuario los rellene correctamente para evitar errores
al procesar en el servidor los datos recibidos. JavaScript constituye una manera
muy conveniente de trasladar esta labor de validación de la información al
ordenador del cliente, descargando así al servidor de esta tarea.

Fig. 5. Formulario usando etiquetas HTML.
En JavaScript, los formularios
son objetos form, que dependen a su vez del objeto document. Cuando se crea el
formulario utilizando la etiqueta <FORM> de HTML, conviene darle un nombre
para poder referenciarlo cómodamente más adelante desde funciones de JavaScript.
Asimismo, todos los elementos del formulario, botones, cuadros de texto, listas,
etc., deberían ser nombrados por la misma razón. JavaScript se añade a los
elementos convencionales del formulario en la forma de gestores de
eventos.
En primer lugar, se crea el formulario
de manera normal, usando las etiquetas HTML convencionales. En la Fig. 5 aparece
el formulario cuyo código se lista a continuación:
<form method = "POST" name =
"registro" onSubmit = "return validar(this)" action = "formularios.asp">
Nombre: <input type="text"
name="nombre" size="20"><br>
Edad: <input type="text" name="edad"
size="2"><br>
Dirección de correo: <input
type="text" name="correo" size="20"><br>
<input type="submit" value="Enviar
datos" name="enviar">
</form>
que consta de tres campos de
entrada y un botón para enviar los datos. Se ha añadido el evento onSubmit, que
se produce cuando el usuario pulsa el botón Enviar datos, de manera que se
invoca a la función validar antes de transmitir nada. El argumento que toma es
this, es decir, el propio formulario. A continuación se presenta el código de
dicha función:
function validar(formulario) {
if (formulario.nombre.value.length <
4) {
alert("Escriba por lo menos 4
caracteres en el campo \"Nombre\".");
formulario.nombre.focus();
return (false);
}
var checkOK =
"ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚabcdefghijklmnñopqrstuvwxyzáéíóú ";
var checkStr = formulario.nombre.value;
var allValid = true;
for (i = 0; i < checkStr.length;
i++) {
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length) {
allValid = false;
break;
}
}
if (!allValid) {
alert("Escriba sólo letras en el campo
\"Nombre\".");
formulario.nombre.focus();
return (false);
}
var checkOK = "0123456789";
var checkStr = formulario.edad.value;
var allValid = true;
var decPoints = 0;
var allNum = "";
for (i = 0; i < checkStr.length;
i++) {
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length) {
allValid = false;
break;
}
allNum += ch;
}
if (!allValid) {
alert("Escriba sólo dígitos en el campo
\"Edad\".");
formulario.edad.focus();
return (false);
}
var chkVal = allNum;
var prsVal = parseInt(allNum);
if (chkVal != "" && !(prsVal
>= "18" && prsVal <= "30")) {
alert("Escriba un valor mayor o igual
que 18 y menor o igual que 30 en el campo \"Edad\".");
formulario.edad.focus();
return (false);
}
if ((formulario.correo.value.indexOf
('@', 0) == -1)||(formulario.correo.value.length < 5)) {
alert("Escriba una dirección de correo
válida en el campo \"Dirección de correo\".");
return (false);
}
return (true);
}
Esta función realiza las siguientes
comprobaciones:
- La longitud del nombre es mayor de cuatro
caracteres.
- El nombre sólo contiene caracteres del alfabeto
español, no contiene números ni caracteres no alfanuméricos.
- La edad sólo contiene números.
- El valor de la edad está comprendido entre 18 y
30.
- La dirección de correo incluye una arroba y su
longitud es superior a cinco caracteres.
6. Cómo cambiar las imágenes
dinámicamente
Una de las aplicaciones más
extendidas y vistosas de JavaScript dentro de una página web es el famoso efecto
de cambiar la imagen cuando el ratón se desliza sobre ella, por ejemplo en los
menús de opciones. Para aprender a realizar este efecto es necesario comprender
antes cómo se acceden y manipulan las imágenes en JavaScript. Cada imagen
insertada con la etiqueta <IMG> en una página se corresponde con un objeto
Image. Además, se crea un array llamado images que contiene secuencialmente,
según el orden de inserción en la página, todas las imágenes de ésta. Así pues,
una primera forma de referenciar las imágenes en una página sería mediante este
array:
document.images[0] //para la primera
imagen del documento
document.images[1] //para la segunda
imagen del documento
etc.
Ahora bien, si a la hora de insertar
una imagen en una página se le da un nombre, éste permitirá referenciarla más
cómodamente por este nombre. Por ejemplo, la imagen
<img name="castillo"
src="fotocastillo.gif" width="110" height="80">
puede referenciarse desde una sentencia
de JavaScript como:
document.images["castillo"]
Cuando se generan los efectos de
cambio de imagen, deben cargarse además de las imágenes que ya están en la
página, las que las sustituirán cuando el ratón pase sobre ellas. Para ello se
utiliza lo que se llama precarga de imágenes: cargar una imagen en el
caché de manera que cuando sea necesaria se visualice inmediatamente en la
página. La precarga se realiza antes de cargar los contenidos del documento,
entre las etiquetas <HEAD>:
boton1_on = new Image()
boton1_on.src = "boton1b.gif"
boton1_off = new Image()
boton1_off.src = "boton1.gif"
El constructor del objeto Image
crea primero una instancia de la imagen boton1_on, a la que posteriormente le
asigna la foto del fichero boton1b.gif. De esta manera, ya ha quedado cargada la
imagen en memoria para ser visualizada instantáneamente en cuanto se le invoque.
Lo mismo ocurre para la segunda imagen.
Ya sólo queda cambiar la imagen
cuando el ratón se deslice sobre ella. Para lograr este efecto se utilizan los
eventos onMouseover y onMouseout. El primero se produce cuando el ratón pasa
sobre un objeto, mientras que el segundo tiene lugar cuando el ratón abandona el
área del objeto:
<a href = "presentacion.html"
onmouseover =
"document.images['boton1'].src =
boton1_on.src" onmouseout =
"document.images['boton1'].src =
boton1_off.src"><img src =
"boton1.gif" name =
"boton1"></a>
Se están definiendo los gestores
de ambos eventos, de manera que cuando el ratón pase sobre la imagen boton1.gif,
que a su vez enlaza con la página web presentacion.html, se cargue la imagen
boton1_on, que como se definió en la precarga, se corresponde con el fichero
boton1b.gif. Cuando el ratón salga del área ocupada por la imagen, entonces se
cargará la imagen boton1_off, que se corresponde con el fichero
boton1.gif.
Como resultaría muy farragoso tener que
escribir todas esas sentencias cada vez para cada hipervínculo, pueden crearse
algunas funciones que simplifiquen el trabajo:
<html>
<head>
<title>Cambio dinámico de
imágenes</title>
<script language="Javascript">
<!--
// Precarga de imágenes
if (document.images) {
var boton1_off = new Image();
boton1_off.src = "imagenes/boton1.gif";
var boton1_on = new Image();
boton1_on.src = "imagenes/boton1b.gif";
}
// Carga de imagen cuando el ratón pasa
por encima
function entra(boton) {
if (document.images) {
if (boton == 'boton1') {
document.images[boton].src =
boton1_on.src;
}
}
}
// Carga de imagen cuando el ratón
abandona el área de la imagen
function sale(boton) {
if (document.images) {
if (boton == 'boton1') {
document.images[boton].src =
boton1_off.src;
}
}
}
//-->
</script>
</head>
<body>
<p><a href =
"suscripcion.html" onMouseOver =
"entra('boton1');" onMouseOut =
"sale('boton1');"><img
src="imagenes/boton1.gif"
alt="Presentación" border="0" name="boton1" WIDTH="150"
HEIGHT="30"></a> </p>
</body>
</html>
Este proceso puede repetirse para
tantas imágenes como aparezcan en la página web. En la figura 6 se muestra el
resultado.
Fig. 6. a) Imagen por defecto. b) Imagen cuando el ratón pasa por
encima.
7. Cálculos matemáticos
sencillos
JavaScript incorpora el objeto
Math, que proporciona propiedades y métodos para realizar funciones matemáticas
y operar con constantes numéricas, como funciones trigonométricas, logaritmos,
potencias, etc. En la siguiente tabla se listan los métodos proporcionados por
Math:
Método |
Descripción |
abs |
Valor
absoluto |
sin, cos, tan |
Funciones trigonométricas
estándar (argumento en radianes) |
acos, asin, atan |
Funciones trigonométricas
inversas (devuelven valor en radianes) |
exp, log |
Potencia y logaritmo natural,
base e |
ceil |
Devuelve el menor entero mayor o
igual que el argumento |
floor |
Devuelve el mayor entero menor o
igual que el argumento |
min, max |
Devuelven el menor o mayor
(respectivamente) de dos argumentos |
pow |
Potencia (el primer argumento es
la base; el segundo, el exponente) |
round |
Redondea el argumento al entero
más próximo |
sqrt |
Raíz
cuadrada |
Tabla 1. Métodos del objeto Math.
Por ejemplo, el seno y coseno de
3p/4 se calcularían como:
Math.sin(3*Math.PI/4);
Math.cos(3*Math.PI/4);
Cuando se van a utilizar varias
funciones o constantes matemáticas, se puede evitar el tener que poner cada vez
Math. de la siguiente manera:
with (Math) {
a = PI * r*r;
y = r*sin(theta);
x = r*cos(theta)
}
A continuación se presenta una sencilla
calculadora del Euro (Fig. 7), capaz de convertir cantidades en pesetas a euros
y viceversa:
<html>
<head>
<title>La calculadora del
Euro</title>
<script language="Javascript">
<!--
function convertir() {
if ( document.calc.conv[1].checked )
factor = 166.386;
else
factor = 0.00601012;
document.calc.resultado.value=document.calc.cantidad.value*factor;
}
//-->
</script>
</head>
<body>
<h1>La calculadora del
Euro</h1>
<form name="calc">
<p><input type="radio"
value="euros" checked name="conv">Convertir pesetas en euros<br>
<input type="radio" name="conv"
value="pesetas">Convertir euros en pesetas</p>
<p>Valor a convertir: <input
type="text" name="cantidad" size="15"><input type="button"
value="Convertir" name="B1"
onClick="convertir()"></p>
<p>Resultado: <input
type="text" name="resultado" size="15"></p>
</form>
</body>
</html>

Fig. 7. Calculadora para convertir pesetas en euros y
viceversa.
Este ejemplo podría combinarse con el
de validación de entrada de datos en formularios (v. Sec. 5), para asegurarse de
que se introducen valores numéricos válidos en las casillas.
8. Cookies
Las cookies constituyen una potente
herramienta empleada por los servidores web para almacenar y recuperar
información acerca de sus visitantes. Dado que el Protocolo de Transferencia de
HiperTexto (HTTP) es un protocolo sin estados (no almacena el estado de la
sesión entre peticiones sucesivas), las cookies proporcionan una manera
conveniente de conservar información entre peticiones del cliente, extendiendo
significativamente las capacidades de las aplicaciones cliente/servidor basadas
en tecnologías web. Mediante el uso de cookies se permite al servidor web
recordar algunos datos concernientes al usuario, como sus preferencias para la
visualización de las páginas de ese servidor, nombre y contraseña, productos que
más le interesan, etc.
Una cookie no es más que un fichero de
texto que algunos servidores piden al navegador que escriba en el disco duro del
ordenador del usuario, con información acerca de lo que ha estado haciendo por
sus páginas o datos que previamente le ha suministrado.
Entre las mayores ventajas de las
cookies se cuenta el hecho de ser almacenadas en el disco duro del usuario,
liberando así al servidor de una importante sobrecarga. Es el propio cliente el
que almacena la información y quien se la devolverá posteriormente al servidor
cuando éste la solicite. Además, las cookies poseen una fecha de caducidad, que
puede oscilar desde el tiempo que dure la sesión con el navegador hasta una
fecha futura previamente especificada, a partir de la cual son
eliminadas.
Las cookies son fácilmente
accesibles a través de la propiedad cookie del objeto document, tanto para
leerlas como para escribirlas. La propiedad document.cookie devuelve una cadena
conteniendo las cookies existentes en el ordenador. Manipulando esta cadena con
las funciones de manejo de cadenas disponibles en JavaScript es posible
localizar la información a extraer, en caso de lectura, o a escribir, en caso de
enviar una cookie.
Cada cookie representa una pequeña
porción de información con una fecha de caducidad opcional, que se añade al
fichero o directorio de cookies con el siguiente formato:
nombre = valor; expires =
fechaCaducidad;
Donde nombre es el nombre del
dato almacenado, y valor representa su valor. La fecha de caducidad es un
parámetro opcional que indica el tiempo que se conservará la cookie. Si no se
especifica fechaCaducidad, la cookie caduca cuando el usuario sale de la sesión
en curso con el navegador. Por consiguiente, el navegador conservará y
recuperará la cookie sólo si su fecha de caducidad aún no ha
expirado.
La forma más sencilla de enviar una
cookie es mediante la siguiente instrucción en JavaScript:
document.cookie='ejemplo=cookie';
Ahora bien, para simplificar el proceso
de escritura, lectura y borrado de cookies, lo mejor es diseñar unas sencillas
funciones en JavaScript:
// Esta es la función que usa Heinle
para recuperar una cookie
// name - nombre de la cookie deseada
// devuelve un string conteniendo el
valor de la cookie especificada o null si la cookie no existe
function getCookie(name){
var cname = name + "=";
var dc = document.cookie;
if (dc.length > 0) {
begin = dc.indexOf(cname);
if (begin != -1) {
begin += cname.length;
end = dc.indexOf(";", begin);
if (end == -1) end = dc.length;
return unescape(dc.substring(begin,
end));
}
}
return null;
}
// Esta es una adaptación de la función
de Dorcht para colar una cookie
// name - nombre de la cookie
// value - valor de la cookie
// [expires] - fecha de caducidad de la
cookie (por defecto, el final de la sesión)
// [path] - camino para el cual la
cookie es válida (por defecto, el camino del documento que hace la llamada)
// [domain] - dominio para el cual la
cookie es válida (por defecto, el dominio del documento que hace la llamada)
// [secure] - valor booleano que indica
si la trasnmisión de la cookie requiere una transmisión segura
// al especificar el valor null, el
argumento tomará su valor por defecto
function setCookie(name, value,
expires, path, domain, secure) {
document.cookie = name + "=" +
escape(value) +
((expires == null) ? "" : "; expires="
+ expires.toGMTString()) +
((path == null) ? "" : "; path=" +
path) +
((domain == null) ? "" : "; domain=" +
domain) +
((secure == null) ? "" : "; secure");
}
// Esta es una adaptación de la función
de Dorcht para borrar una cookie
// name - nombre de la cookie
// [path] - camino de la cookie (debe
ser el mismo camino que el especificado al crear la cookie)
// [domain] - dominio de la cookie
(debe ser el mismo dominio que el especificado al crear la cookie)
// se considera el camino y dominio por
defecto si se especifica null o no se proporcionan argumentos
function delCookie (name,path,domain) {
if (getCookie(name)) {
document.cookie = name + "=" +
((path == null) ? "" : "; path=" +
path) +
((domain == null) ? "" : "; domain=" +
domain) +
"; expires=Thu, 01-Jan-70 00:00:01
GMT";
}
}
Existen unas páginas web de ejemplos en
las que se puede ver cómo se utilizan estas funciones en aplicaciones reales
escritas en JavaScript:
www.iec.csic.es/criptonomicon/cookies/ejemplos.html
En la siguiente página web se encuentra
una aplicación en JavaScript que permite hornear cookies de manera instantánea,
ya que crea automáticamente el código JavaScript para leer, escribir o borrar
cookies, listo para copiar y pegar donde haga falta (Fig. 8):
www.iec.csic.es
/criptonomicon/cookies/horno.html

Fig. 8. Horno Express para crear automáticamente código para
cookies.
9. La barra de estado
La barra de estado que aparece en
la parte inferior de la ventana del navegador puede contener mensajes
informativos configurados por el diseñador, como por ejemplo una breve
descripción de lo que puede encontrarse si se sigue un enlace. Existen dos
propiedades del objeto window para manipular el valor de la barra de
estado:
- defaultStatus: establece el mensaje que se
visualizará por defecto cuando no hay nada más en la barra de
estado.
- status: especifica una prioridad o un
mensaje transitorio en la barra de estado, que tiene preferencia sobre el
valor especificadado en defaultStatus.
En ambos casos debe devolverse
true si se desea establecer la propiedad defaultStatus o status en los gestores
de eventos onMouseOut u onMouseOver.
La propiedad defaultStatus suele
establecerse al cargar la página, utilizando el evento onLoad en la etiqueta
<BODY>, que se produce cuando comienza a cargarse el documento. Por otro
lado, la propiedad status se suele establecer en los enlaces, utilizando el
evento onMouseOver:
<html>
<head>
<title>La barra de
estado</title>
</head>
<body onLoad =
"defaultStatus='Página con información sobre la barra de estado'; return
true;">
<h1>La barra de estado</h1>
<p>Esta página contiene
información sobre la barra de estado. Puede visitarse esta otra página para
<a href = "escribir.html" onMouseover = "status = 'Más información'; return
true;">más información</a>.</p>
</body>
</html>
En la Fig. 9 se representa el efecto de
estas funciones.


Fig. 9. Mensajes en la barra de estado del navegador.