Vamos a ver ahora algunas de las aplicaciones más comunes del lenguaje JavaScript al tratamiento de imágenes, y sin duda la más conocida de ellas es el efecto conocido como rollover, en el que al pasar el cursor sobre una o más imágenes de nuestra página, éstas cambian dinámicamente, apareciendo una nueva imagen. Posteriormente, cuando el cursor se va de esta, el sistema vuelve a su estado inicial.
Vamos a empezar con un rollover simple, de una sóla imagen, ya que con él podremos explicar con claridad las bases teóricas de la construcción de este tipo de efectos.
Tenemos pues una imagen en nuestra pantalla, y lo primero que deseamos en que al pasar el cursor sobre ella «pase algo», pero hemos visto que el objeto Image no admite de forma estándar el evento que necesitamos, onmouseOver. Para solucionar esto hemos visto en el capítulo anterior que podemos recurrir a situar nuestra imagen dentro de un enlace, ya que este sí admite el evento que necesitamos.
Por lo tanto, situamos la imagen, con el atributo border igualado a cero, dentro de un enlace, al que vamos a dejar el cursor estándar, ya que normalmente los rollover se usan para menús, y en estos la pulsación debe llevar a una nueva página, por lo que con el cursor en forma de mano el usuario sabrá que eso es un enlace. No obstante, en el ejemplo que vamos a construir no vamos a apuntar a ninguna página en concreto, para no perder la atención, así que vamos a llamar a la página # (que no es ninguna), y en el evento onClick añadiremos return false.
¿Qué ponemos dentro del evento onmouseOver del enlace? Inicialmente, vamos a acceder desde él a la propiedad src de la imagen que contiene, y vamos a cambiar esta ruta, de forma que la imagen, aún llamándose igual, apunte a otro fichero gráfico, con lo que el cambio será efectivo. Para ello necesitamos haber asignado un name a la imagen. El código que necesitamos es pues:
<a href= «#» onmouseOver=»document.ejemplo1.src=’manzana2.jpg’;» onClick=»return false;»>
<img name=»ejemplo1″ src=»manzana.jpg» width=»150″ height=»121″ border=»0″>
</a>
Bien, ya nos cambia la imagen, pero… ¿cómo hacemos que se vuelva a la original cuando el cursor deja la nueva? Muy fácil, usando el evento onmouseOut de forma análoga a como hemos usado onmouseOver:
<a href= «#» onmouseOver=»document.ejemplo2.src=’manzana2.jpg’;» onClick= «return false;» onmouseOut=»document.ejemplo2.src=’manzana.jpg’;»>
<img name=»ejemplo2″ src=»manzana.jpg» width=»150″ height=»121″ border=»0″>
</a>
Pero hay un problema. Cuando se activa el evento onmouseOver, nuestro código llama a la imagen activa manzana2.jpg, pero esta imagen no está cargada en la memoria caché del navegador, por lo que éste necesita hacer una nueva petición HTTP al servidor para pedírsela, cargarla luego en memoria y por último mostrarla en pantalla. Resultado de todo esto: hay un periodo de tiempo en el que la imagen inicial desaparece y se muestra en su lugar un recuadro vacío. ¿Cómo podemos solucionar esto?
Basta con precargar la imagen activa antes de que se ejecute el código del evento, ya que así el navegador la tendrá disponible en su caché y el proceso de cambio de imágenes será instantáneo. Para precargar una imagen debemos usar el método constructor de objetos Image en la cabecera de nuestra página, y en él debemos especificar tanto el tamaño de la imagen que deseamos cargar como la ruta de la misma. Nuestro código queda:
<script language=»JavaScript» type=»text/javascript»>
imagenOn = new Image(150,121);
imagenOn.src = «manzana2.jpg»;
</script>
</head>
<body>
<Palign= center>
<A href= «#» onclick=»returnfalse;» onmouseover=»document.ejemplo.src=’manzana2.jpg’;» onmouseout=»document.ejemplo.src=’manzana.jpg’;»>
<IMG name=»ejemplo» src=»manzana.jpg» alt=»ejemplo de rolloversimple» width=»60″ height=»60″ border=»0″>
</A>
</P>
…
…
</body>
También podemos crear un rollover compuesto en el que, además del efecto que ya hemos obtenido, se presente una nueva imagen si el usuario hace click sobre la imagen activada. Para ello sólo es necesario precargar otra imagen y acceder de nuevo a la propiedad src, esta vez mediante el evento onClick.
Pero para ello, esta vez vamos a definir unas cuantas funciones, una para cada evento, en la cabecera de la página, y vamos a llamarlas con los eventos. Examina el siguiente código:
<script language= «JavaScript»type= «text/javascript»>
var estado = false;
imagenInicial = new Image(60,60);
imagenOn = new Image(60,60);
imagenClick = new Image(60,60);
imagenInicial.src = «images/avatar.gif»;
imagenOn.src = «images/avatar2.gif»;
imagenClick.src = «images/avatar3.gif»;
function over( )
{
if(estado = = false)
{
document.ejemplo.src = imagenOn.src;
}
else
{
return;
}
}
function out( )
{
if(estado = = false)
{
document.ejemplo.src = imagenInicial.src;
}
else
{
return;
}
}
function pulsar( )
{
document.ejemplo.src = imagenClick.src;
estado = true;
}
</script>
</head>
<body>
<P align=center>
<A href=»#» onmouseout=»out();» onmouseover=»over();» onclick=»pulsar();return false;»>
<IMG name=»ejemplo» src = «images/avatar.gif» alt= «ejemplode rollover simple» width= «60» height = «60» border = «0»>
</A>
</P>
…
…
</body>
Explicamos el código un poco:
En el script de la cabecera declaramos los 3 objetos Image que nos van a hacer falta, uno para la imagen inicial (imagenInicial), otro para la activa (imagenOn) y el tercero para la imagen que debe aparecer al hacer click (imagenClick), estableciendo sus rutas de acceso, con lo que dichas imágenes se cargarán en la caché del navegador al empezar a cargar la página.
Seguidamente creamos 3 funciones, una para cambiar la imagen en pantalla en cada uno de los casos posibles, y luego en el enlace en que está incluida la imagen en el BODY llamamos a cada función mediante el evento correspondiente.
Si el usuario pincha en la imagen, esta cambiará, pero al salir el cursor de ella volverá a su estado inicial. Como ahora no nos interesa que ocurra esto, si no que lo que queremos es que una vez pinchada la imagen ésta permanezca ya fija, lo que hacemos es declarar una variable contador, de tipo booleano, al principio del script, y lo hacemos fuera de toda función para que sea de carácter público, es decir, que pueda ser accedida en cualquier momento por cualquier función de nuestro código.
Por último, en la función pulsar(), que es la que llamamos mediante el evento onClick, cambiamos el valor de esta variable contador a true, y establecemos en los códigos de las funciones over() y out() que se cambie la imagen sólo en el caso de que contador sea false. Con esto nos aseguramos que el cambio de imagen al pasar el cursor y al quitarlo sólo se realice en caso de que antes no se haya hecho click en la imagen.
En caso de que se haya hecho ya click (el contador valdrá true), las funciones over() y out() sólo ejecutarán la orden return, que en realidad no hace nada, sólo detener la ejecución de la función.
Resulta un poco lioso de explicar con palabras simples, pero si miras el código de arriba detenidamente lo entenderás bien.
Si observáis el código fuente de paginas con este efecto, veréis que el código tal vez esté escrito de otra forma, mas «profesional», pero creo que una explicación basada en la aplicación clara y directa de los eventos y propiedades del objeto Image es el método más claro de entender porqué ocurren estos cambios en una imagen.
–
Artículo de Luciano Moreno
(Dep. Diseño Web BJS Software)