Manual Tratamiento Imagenes Javascript
Manual Tratamiento Imagenes Javascript
Manual Tratamiento Imagenes Javascript
www.desarrolloweb.com
Tratamiento de imágenes en
Javascript
El array images posee la propiedad length, que almacena el número de imágenes presentes en
el documento. Para obtener éste, basta con escribir:
document.images.length.
Ejemplos:
• Acceso a la propiedad WIDTH de la imagen bandera:
document.images.bandera.width
o bien,
document.bandera.width
• Acceso a la propiedad SRC de la imagen bandera:
document.images[1].src
Como ejemplo práctico, vamos a mostrar en pantalla la anchura de la imagen siguiente:
dime anchura
De esta forma podemos acceder y/o cambiar cada una de las propiedades de una imagen. Por
ejemplo, si queremos cambiar la anchura de la imagen anterior basta con escribir:
document.logotipo.width="100"
que podéis comprobar pulsando el siguiente botón:
cambia anchura
Nota: el atributo width es de sólo lectura para Nestcape 4x, por lo que podemos leer su valor,
pero no modificarlo. En cambio, sí podemos hacer esto en Internet Explorer y en Nestcape 6x.
Podéis ver más sobre las propiedades o atributos de una imagen en el manual de imágenes en
HTML, de HTML Web, pero vamos a ver un resumen de ellas en el siguiente capítulo.
JavaScript, permitiendo este lenguaje leer estas propiedades e incluso cambiar muchas de
ellas. La forma de acceder a todas ellas es:
document.nombre_imagen.propiedad
Las principales propiedades del objeto Image son:
• name, que referencia el nombre identificador único de la imagen asociada al objeto. La
forma de acceder a esta propiedad es:
document.images[indice].name
Podemos por ejemplo aprovechar el array images para obtener el name de todas las
imágenes de nuestra página:
onClick="alert(ruta);">
Esta propiedad es fundamentalmente usada para construir rollovers, en los que
cambiamos dinámicamente su valor. Para ello, hay que establecerlo siempre entre
comillas, dobles o simples, ya que src trata la ruta como una cadena de texto (variable
de tipo string).
• width / height, que representan la anchura y la altura de la imagen asociada al
objeto, y que podemos leer (en los 3 navegadores comunes) y cambiar (sólo en
Explorer y Nestcape 6x) de forma dinámica. Ejemplo:
<input type="button" value= "dame altura"
onClick="alert(document.dinosaurio.height)">
• border, que se refiere al atributo border de la imagen asociada al objeto. Para acceder
a esta propiedad deberemos escribir:
document.images[indice].border o document.nombre_imagen.border
Como ejemplo, vamos a cambiar dinámicamente el borde de la imagen inferior:
<input type="button" value="cambia borde" onClick="document.icono.border=10;">
Nota: esto sólo funcionará en Internet Explorer y en Nestcape 6x; para las versiones 4x
de Nestcape esta propiedad es de sólo lectura, por lo que podemos obtener su valor,
pero no cambiarlo.
• hspace / vspace, que definen el espacio horizontal o vertical de una imagen flotante
respecto al texto que la rodea. El acceso a esta propiedad se logra mediante:
document.nombre_imagen.hspace
• lowsrc, que fija la ruta de una imagen accesoria, generalmente una versión de menos
peso en Ks de la imagen principal, que se debe cargar en pantalla mientras se recibe
ésta. Su sintaxis es:
document.nombre_imagen.lowsrc
• prototype: propiedad muy importante desde el punto de vista del programador web,
ya que permite añadir propiedades y métodos adicionales a un objeto Image, es decir,
permite ampliar lo que es el objeto en sí, aumentando sus propiedades por defecto. No
vamos a entrar en detalles sobre esta propiedad, común a muchos de los objetos
propios de JavaScript, ya que para su uso hace falta un conocimiento profundo de este
lenguaje. Pero si decir que sirve, por ejemplo, para asignar una nueva propiedad, que
vamos a llamar orden, de tipo numérico, en la que podemos guardar un orden de
presentación en una ventana flotante, y mediante código permitir al usuario que
seleccione una serie de imágenes de las contenidas en nuestra página. Luego, mediante
esta nueva propiedad orden podemos presentarlas ordenadas en la pantalla flotante (es
sólo un ejemplo). Para más información al respecto, consultar un buen manual de
JavaScript avanzado.
• complete: propiedad del objeto Image de tipo booleano, cierta cuando la imagen se ha
acabado de cargar en memoria, y falsa en caso contrario. Sólo es soportada por
Nestcape Navigator, por lo que no se debe usar, en vistas a la compatibilidad.
Con esto acabamos las propiedades principales del objeto Image. Sólo añadir que las
propiedades border, name y vspace no son accesibles para objetos creados mediante el
constructor Image( ). Este método constructor de nuevos objetos Image lo vamos a
estudiar a continuación, junto con los principales eventos soportados por una imagen.
• onmouseOver, que se activa cuando se el puntero del ratón pasa sobre la imagen.
Ejemplo de sintaxis:
<img name= "imagen1"src="images/logo.gif" onmouseOver="alert('gracias por pasar sobre
mí)">
• onmouseOut, que se activa cuando el puntero del ratón, trás pasar sobre la imagen,
se va de ella. Ejemplo de sintaxis:
<img name= "imagen1"src="images/logo.gif" onmouseOut="alert('adios, amigo')">
Nota lo siguiente:
1) si sitúas el cursor sobre la imagen verás que éste se transforma en la mano típica de los
enlaces. Lógico, ya que hemos transformado la imagen en uno de ellos. Si deseas eliminar este
efecto, basta con asignar al enlace un estilo para el cursor, dejando este como default:
Bien, ya nos cambia la imagen, pero....¿cómo hacemos que se vuelva a la original cuando el
cursor deja la nueva?. Muy facil, usando el evento onmouseOut de forma análoga a como
hemos usado onmouseOver:
<a href= "#" onmouseOver="document.ejemplo.src='images/avatar2.gif';" onClick= "return
false;" onmouseOut="document.ejemplo.src='images/avatar.gif';">
<img name="ejemplo" src="images/avatar.gif" width="60" height="60" border="0">
</a>
¡Qué bonito!. Pero hay un problema, y gordo. Cuando se activa el evento onmouseOver
nuestro código llama a la imagen activa avatar2.gif, 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?.
Fácil, amigo. 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:
body>
y su resultado es el que sigue:
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 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:
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>
cuyo resultado es el que sigue:
que cambian al pasar el cursor sobre ellas, y para hacer algo útil, vamos a aplicar este rollover
a la construcción de un menú.
Indudablemente, podríamos basarnos en lo estudiado en el rollover simple para crear uno
múltiple, pués basta establecer en los eventos de los enlaces una llamada a la propiedad src
de cada imagen, o también crear 2 funciones para cada imagen y llamar a cada una de ellas en
el momento oportuno.
No vamos a hacer esto, ya que repetiríamos código innecesario, pero tampoco vamos a crear
unas funciones basadas en cambiar matrices de imágenes mediante bucles, porque creo que
entonces no se vería claro el porqué de cada función y variable.
Por lo tanto, vamos a crear un código lo más simple y claro posible, tal que se pueda entender
bien su uso, ya que el objeto de este pequeño manual es aprender porqué se hacen las cosas,
no presentar script muy avanzados y bonitos.
Vamos a basarnos en lo aprendido hasta ahora, llamando a una misma función en los dos
eventos, función que va a admitir dos parámetros: el name de la imagen a cambiar y el
nombre del objeto Image cuyo src va a ser el nuevo que asignemos.
Nuestro menú va a estar formado por 3 imágenes, cada una con un enlace, y lógicamente lo
primero que debemos hacer será precargar todas ellas, tanto activas como iniciales. Vamos a
ver primero el código completo necesario para el menú y su efecto, y posteriormente
explicaremos el código someramente:
<html>
<head>
<title>ejemplo de rollover múltiple</title>
<script language="JavaScript" type="text/javascript">
home=new Image(80,20);
homeOn=new Image(80,20);
html=new Image(80,20);
htmlOn=new Image(80,20);
java=new Image(80,20);
javaOn=new Image(80,20);
home.src="images/homeOff.gif";
homeOn.src="images/homeOn.gif";
html.src="images/htmlOff.gif";
htmlOn.src="images/htmlOn.gif";
java.src="images/javaOff.gif";
javaOn.src="images/javaOn.gif";
function cambia(nombre,activa)
{
document.images[nombre].src=activa.src;
}
</script>
</head>
<body>
<P>
<A href="#" onmouseout="cambia('primera',home);" onmouseover="cambia('primera',homeOn);" onclick="return
false;">
<img name="primera" src="images/homeOff.gif" width="80" height="20" border="0" alt="home">
</A>
<P>
<A href="#" onmouseout="cambia('segunda',html);" onmouseover="cambia('segunda',htmlOn);" onclick="return
false;">
<img name="segunda" src="images/htmlOff.gif" width="80" height="20" border="0" alt="home">
</A>
<P>
<A href="#" onmouseout="cambia('tercera',java);" onmouseover="cambia('tercera',javaOn);" onclick="return
false;">
<img name="tercera" src="images/javaOff.gif" width="80" height="20" border="0" alt="home">
</A>
</P>
</body>
</html>
cuyo efecto es el que sigue:
Como hemos dicho antes, lo primero que hacemos es precargar las 6 imágenes que vamos a
usar, asignando cada una de ellas a un objeto Image que creamos con el método constructor
conocido: las 3 iniciales (home, html y java) y las 3 activas (homeOn, htmlOn y javaOn).
Seguídamente creamos nuestra única función, cambia(nombre,activa), que va a admitir como
parámetros nombre, que es el name de la imagen del BODY que va a cambiarse, y activa, que
es nombre del Objeto imagen cuya imagen asociada (mediante su parámetro src) es la que
deseamos que aparezca mediante la función.
Con este planteamiento podemos cambiar las veces que queramos cualquier imagen de la
página; basta para ello decirle a la función qué imagen debe cambiar y por cuál.
Entonces, aprovechamos los enlaces de cada una de las 3 imágenes de nuestro menú para
llamar a la función cambia, pasándole en cada onmouseOver el name de la imagen contenida
en el enlace y el nombre del objeto Image que define la nueva imagen a aparecer, y llamándo
a la función de nuevo en cada evento onmouseOut para volver las cosas a su estado inicial.
En la función hemos escrito document.images[nombre].src, con el parámetro nombre entre
paréntesis porque la imagen es en este caso un elemento de la matriz images, que contiene
todas las imágenes del documento (también se podía haber escrito document [nombre], ya
que document contiene todos los objetos predefinidos del documento, sean imágenes, enlaces
o formularios), y desde el evento hemos pasado este parámetro entre comillas simples porque
como atributo de un objeto hay que hacerlo así (si se la hubiésemos pasado sin comillas nos
daría un error, ya que le estaríamos pasando entonces un objeto, y no un atributo, que es lo
que name es en realidad).
Y desde estos eventos hemos pasado el valor del parámetro activa sin comillas porque en la
escritura de la función tenemos activa.src, es decir, hace referencia a la propiedad src de un
objeto Image.
Como norma general, cuando a una función de JavaScript le pasamos como parámetro un
atributo (name de una imagen o enlace, id de una capa, etc.) deberemos hacerlo siempre
entre comillas, mientras que si le pasamos como parámetro un objeto, hay que hacerlo sin
incluirlo entre ellas.
No creo que sean necesarias más explicaciones, ya que el código es bastante simple. Sólo
decir que muchos autores introducen en el código inicial de la función cambia un condicionante
if(document.images), y que con ello lo que persiguen es que el código siguiente sólo se ejecute
en el caso de que el navegador acepte este objeto de JavaScript. Podemos tranquílamente
pasar de este condicionante, ya que la gran mayoría de los navegadores actuales soportan el
objeto Image de JavaScript.
Conclusiones
Bien, amigos. Hasta aquí este pequeño tutorial sobre tratamiento de imágenes en JavaScript.
En él hemos aprendido cómo para este lenguaje cada imagen del documento es un objeto
propio, con sus métodos y propiedades específicas, y cómo podemos acceder a estas
propiedades, leerlas y cambiarlas dinámicamente.
También hemos estudiado los principales eventos que soportan las imágenes, y cómo podemos
usar enlaces para ampliar el número de eventos compatibles con todos los navegadores más
comunes.
Por último hemos visto la aplicación práctica de todo ello en la construcción de rollovers
simples y múltiples. Desde luego que no son estos las únicas aplicaciones del tratamiento de
imágenes y JavaScript, ni tampoco como aquí las hemos estudiado son la forma común en que
podéis encontrarlos en diferentes páginas web de Internet, en las que se construyen matrices
de imágenes y se accede a las propiedades de éstas mediante bucles. Pero creo que sin duda
hemos visto una forma de aplicarlos que puede resultar clara y educativa.
De todas formas sabed que todos los scripts que encontréis por ahí basados en imágenes usan
en mayor o menos medida lo que hemos estudiado en este manual, aunque también añadan
elementos del lenguaje JavaScript que complementen el código.
Si detectas algún fallo en lo expuesto en estas páginas o conoces algo que permita ampliarlas,
escríbenos. Todo esto lo hacemos con tu ayuda.
Tal vez en un futuro ampliemos este manual con alguna aplicación práctica más. Hasta
entonces, que la fuerza os acompañe.
efectivas ni apropiadas en muchos casos. Sugeriremos aquí la más conveniente para según
qué casos.
Nota: Se pretende corregir algunos puntos y profundizar en ciertos aspectos que no se tratan en tánta
profundidad en otro artículo de esta misma web: Introducción al tratamiento de imágenes en Javascript
de Luciano Moreno. Se recomienda leer también dicho artículo para contrastar y porque puede servir de
complemento a éste, ya que se explican aspectos que no se detallan aquí.
Para que A no se quedara como página vacía pensé en utilizarla para precargar ahí los gráficos
que B emplearía.
El problema
CóDIGO 1
<HTML>
<!-- Esta es la página A que debía precargar las imágenes que se usan en B -->
<HEAD>
<TITLE>Cargando...</TITLE>
<SCRIPT TYPE="text/javascript">
function cargaImagen(arg) {
if (document.images) {
document.write("Cargando imagen: " + arg + "...<br>");
rslt = new Image();
rslt.src = '"'+ arg +'"';
document.write("\t cargada con éxito<br>");
return rslt;
}
}
if (document.images) {
imagen1=cargaImagen("imagenes/pedazo1.jpg");
imagen2=cargaImagen("imagenes/pedazo2.png");
imagen3=cargaImagen("imagenes/pedazo3.jpg");
imagen5=cargaImagen("imagenes/pedazo5.jpg");
imagen6=cargaImagen("imagenes/pedazo6.png");
imagen7=cargaImagen("imagenes/pedazo7.png");
imagen8=cargaImagen("imagenes/pedazo8.jpg");
imagen9=cargaImagen("imagenes/pedazo9.jpg");
document.write("CARGA TERMINADA");
}
<-- Aquí abrimos la ventana maximizada B que es nuestra verdadera página de inicio en la web -->
privenmax=window.open('inicio.html','principal','fullscreen=yes');
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
FIN DE CÓDIGO 1
RESULTADO: Sale 1 ventana maximizada (inicio.html) que carga las imágenes como siempre,
y lo que es más, la primera ventana en la que con document.write se indica qué imágenes se
han ido cargando queda minimizada en la barra de tareas, con lo cual no se ve.
detiene el proceso de carga del resto del código de la página hasta que ha precargado esa
imagen en la Caché. Ésto no es así. Al leer el código anterior, el navegador comienza a cargar
en segundo plano las imágenes y SIGUE cargando código HTML. Es decir, la carga de imágenes
con javascript y la carga del resto de código llegan casi a SOLAPARSE en ocasiones, siendo lo
más normal que el navegador llegue a la etiqueta </HTML> sin que una sóla imagen esté en la
Caché, pese haberla precargado antes (es decir, instanciado de objetos de la clase Image).
Una vez leída la etiqueta </HTML> tanto la precarga de imágenes ya declaradas con
JavaScript, como las imágenes estáticas que se encuentren en etiquetas HTML siguen su
proceso de carga normal hasta completarse.
Dicho ésto, cabe decir que NO debemos pues confundir el evento onLoad que frecuentemente
se usa en <BODY> con que una página web esté cargada en su totalidad. Al contrario, con
dicho evento sólo detectaremos que el navegador ha leído la última etiqueta de la página, pero
imágenes,sonidos, u otros objetos incrustados en la página proseguirán independientemente
su carga.
En cuanto a por qué se sigue usando el método éstandar de precarga que proporcionan ciertos
programas o que diseñan por su cuenta los propios programadores web,las razones son las
siguientes:
• No se busca mostrar todas las imágenes de una página a la vez,o el "peso" de esas
imágenes es tan poco que apenas hay desfase entre la carga de imágenes y del código
HTML en sí, con lo cual dicho desfase apenas se nota. Habrá pocas imágenes y serán
estáticas.
• Compatibilidad: la solución al problema de la precarga será el uso de la propiedad
complete de Image que veremos más adelante. Esta propiedad está disponible en
Netscape Navigator desde la v.3, mientras que en Internet Explorer es desde la v.4 Así,
si queríamos abarcar navegadores 3.0 y usar complete dejaríamos al margen a Internet
Explorer v.3
• El desconocimiento de una mejor alternativa. Generalmente se cae en la rutina abusiva
del Copiar-Pegar código de otras páginas y, además cada vez existen más programas de
fácil manejo que con entornos gráficos crean páginas web sin que el usuario que no
sabe programación sepa el verdadero significado del código que insertan dichos
programas.
A continuación mostraremos el código que nos va a permitir que tres imágenes se carguen
primero y luego aparezcan simultáneamente en pantalla. En el ejemplo original se usaron
archivos gráficos .bmp y de un alto peso (unos 620KB cada uno), pues la página se probó
descargándola de la red con una conexión de Cable; con imágenes de pocos KB no daría
tiempo a comprobar el efecto, pues su aparición en pantalla tanto con precarga como sin ella
sería prácticamente inmediata. Las imágenes de este artículo son las mismas que las
originales, pero en formato jpg pues se trata de visualizar simplemente el ejemplo.Tenemos 3
imágenes distintas que aparecerán a la vez: foto1.bmp foto2.bmp foto3.bmp La primera estára
compuesta por un Roll-Over con estados onMouseOver y onMouseOut. La imagen del centro
sería la misma que aparece en la primera con el cursor sobre ella (más tarde explicaremos el
por qué). La tercera es una imagen distinta,que no se usa ni en el Roll-Over ni en la central
(ver fotos).
El código que precargará y mostrará todas las imágenes simultáneamente es el que sigue:
CÓDIGO 2
x=new Image(150,150); //la x no tiene por q llamarse roll, que es el NAME de <img>
x.src="foto1.bmp";
y=new Image(150,150);
y.src="foto2.bmp";
function empieza() {
if (x.complete) flagx=true;
if (y.complete) flagy=true;
if (z.complete) flagz=true;
window.status="Foto1 Cargada: " + x.complete + " Foto2 Cargada: " + y.complete + " Foto3 Cargada: " +
z.complete;
</script>
</head>
<BODY onLoad="tiempo=setTimeout('empieza()',1000);">
<H1 STYLE="white-space: pre">Aquí comienza el cuerpo del documento.
Foto 2 y Foto 3 ya se estan precargando
</H1>
<BR>
<H1 STYLE="white-space: pre">Aquí terminó la carga del código HTML.
La etiqueta <\HTML> viene justo debajo<H2>
</BODY>
</HTML>
FIN DE CÓDIGO 2
pantalla.
4. Al llegar a <HTML> se invoca a la función empieza() que mediante unas variables flags
estima qué imagen se ha cargado ya.
5. Cada 1 segundo con setTimeout se comprueba cómo marcha la carga de imágenes y se
refleja a modo orientativo en la Barra de Estado del Navegador.
6. Cuando las 3 flags toman el valor TRUE se asigna una imagen a cada etiqueta <IMG>
que permanecía sin contenido,a través de su atributo NAME=...
RESULTADO: todas las imágenes se muestran simultáneamente sin desfase de tiempo,
incluídas las de los diferentes eventos del Roll-OVer. Si hubiésemos hecho la precarga estándar
las imágenes se mostrarían a saltos y se podrían dar situaciones curiosas como que,si durante
la carga ponemos el puntero sobre la imagen Roll-Over y lo sacamos de ella,foto1 foto2 foto3
se cargarían,pero al hacer onMouseOver de nuevo sobre el Roll-Over el Navegador volvería a
solicitar y cargar de nuevo foto2 pese a haberse cargado ya previamente para visualizarla en la
imagen central.
PÁGINA
CARGANDO
PÁGINA
CARGADA
Últimas consideraciones
INICIO DE CODIGO
<HTML>
<HEAD><TITLE>Cargando Imagenes</TITLE>
<STYLE TYPE="text/css">
DIV { background-color: black; color: white; border: 2px solid red; width: 30% }
</STYLE>
<SCRIPT TYPE="text/javascript">
//Script por José.A Torres
//Majadahonda 2003
for (cont=0;cont<miArray.length;cont++) {
document.write("<DIV NAME='capa'>");
document.write("Imagen: " + miArray[cont].replace(patron,""));
document.write("<br>");
document.write("...en cola de Precarga OK<br></DIV>");
}
document.write("TODAS LAS IMAGENES YA ESTAN EN PRECARGA");
cont=0;
function pruebaCarga() {
if (eval("imagen"+cont).complete == true) {
window.defaultStatus= "Imagen"+cont+ "/" + miArray.length + " CARGADA";
cont++;
if (cont<miArray.length) setTimeout('pruebaCarga()',500);
else {
window.defaultStatus="Carga de imágenes TERMINADA";
window.open("inicio.html","MenuPrincipal","fullscreen=yes");
}
}
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#808AC2" onLoad="pruebaCarga();return true;">
<!-- cuerpo de la pagina -->
</BODY>
</HTML>
FIN DE CODIGO
Explicación:
En un Array metemos las rutas relativas de todas las imágenes a precargar. En este caso,se
encuentran todas en la carpeta Imágenes, pero no hay problema en que estén en varias
diastintas mientras se indique en el array la ruta correcta.
El script crea automáticamente las referencias a cada objeto imagen para poder tener acceso a
cada objeto y a sus propiedades. La denominación automática es imagen0,imagen1,imagen2..
[...]..imagen+miArray.length-1
La línea de código
patron = RegExp("imagenes/");
y más adelante:
+ miArray[cont].replace(patron,"")
son pura estética. Con ambas indicamos a document.write que de los argumentos del Array omita
escribir en pantalla la subcadena: "imagenes/" para no mostrar la ruta completa, pues en
ciertos casos ésta podría ser bastante larga si tenemos una ruta demasiado larga. Si las rutas
fuesen por ejemplo "paginainicio/articulos/electrónica/imágenes/camaras..."
"paginainicio/articulos/electrónica/imágenes/moviles..."
podríamos asignar:
patron = RegExp("paginainicio/articulos/electrónica/imágenes/");
para omitir en cada imagen cargada esa cadena.
Lo mismo ocurre con las etiquetas <DIV> ...</DIV> se han utilizado para que el usuario mediante
hojas de Estilo incrustadas o por el atributo STYLE de DIV defina cómo se van a mostrar las
líneas que nos informan del progreso de carga en pantalla: colores,tamaños,fondo,bordes,etc.
Otro aspecto meramente de Forma.
Finalmente, cuando el navegador lee la última etiqueta HTML se llama repetidamente a una
función function pruebaCarga() que comprueba el estado de CADA imagen.Sobre los tiempo de
llamada (medio segundo en el ejemplo, o 500 milisegundos) conviene no abusar poniendo
valores como 1 milisegundo o en general valores más bajos de 250 o 300 pues podríamos
forzar demasiado los recursos del navegador y ,según en qué casos, obtener un error de "out
of memory".
Cada imagen que se detecta como cargada se reflejará en la barra de estado del navegador
(esquina inferior izquierda) y el total de las que hay. Finalmente, cuando todo está cargado la
página nos autoconduce con window.open a inicio.html donde ya podremos hacer libre uso de
todas las imágenes.
Podemos comprobar que todo ha funcionado de una forma simple: borramos antes de nada la
Caché de nuestro navegador y lo configuramos en "Actualizar la página cada vez que se
visita". A continuación ejecutamos la página cargadora de imágenes. Al terminar veremos en
Herramientas/Opciones de Internet/Configuración/Ver Archivos (en caso de Internet Explorer)
que efectivamente las imágenes han "bajado" correctamente, pese a no advertir el clásico
aviso del navegador de "Cargando imagen...", pues todo se hace en segundo plano.
Si volvemos a cargar la página una segunda vez, veremos que en la barra de Status las
imágenes se cargan a una gran velocidad, pues se detecta que ya están en la caché y no hay
necesidad de volver a cargarlas.
AVISO IMPORTANTE
Para probar el código es necesario "colgar" realmente las páginas en internet, o al menos que
las rutas indicadas en el Array apunten a cualquier carpeta contenedora de imágenes en
internet. Si probamos el ejemplo en "Local", en nuestro propio Pc, con las imágenes también
en nuestro ordenador, el script parece no funcionar, pero sólo parece. Esto es así porque el
Navegador no almacena las imágenes en su Caché, pues detecta que YA se encuentran en
nuestro disco duro y no hay necesidad de "bajarlas". Para que el Status "Imagen4/x Cargada"
se visualice en tiempo real,la ventana debe de tener el foco activo.Si al ejecutar la página la
minimizamos, el script seguirá ejecutándose correctamente y precargando, pero sólo al
seleccionarla otra vez veremos el nuevo Status actualizado.