Foros del Web » Programando para Internet » Javascript »

Duda con precarga de imágenes

Estas en el tema de Duda con precarga de imágenes en el foro de Javascript en Foros del Web. Hola!! Ya se que este tema está muy visto... pero por mucho que busco soluciones no consigo lograr lo que quiero. Pretendo precargar una serie ...
  #1 (permalink)  
Antiguo 01/12/2009, 09:46
 
Fecha de Ingreso: diciembre-2008
Mensajes: 100
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Duda con precarga de imágenes

Hola!!

Ya se que este tema está muy visto... pero por mucho que busco soluciones no consigo lograr lo que quiero.

Pretendo precargar una serie de imágenes en la caché del navegador porque tengo una serie de imágenes de gran tamaño en una galería y quiero que se muestren al usuario lo más rápido posible cuando pinche en la imagen minimizada (thumbail).

He probado de varias formas:

1- Con un array de imagenes y creando objetos Image:

Código:
var imagenes = new Array(datos.length);

for(var i=0;i<imagenes.length; i++)
{
   imagenes[i] = new Image();
   imagenes[i].src = datos[i];
}
Probando con el array imagenes siendo local a una función y global.

2- Añadiendo todas las imágenes a un div con propidead display a none (porque supongo que el navegador cargará la imagen al colocarla en un div oculto...):

Código:
document.getElementById("info").innerHTML = "<div id='img-cache' style='display:none;'></div>";

for(var i=0;i<datos.length; i++)
{
   document.getElementById("img-cache").innerHTML +=
           "<img src="+datos[i]"></img>";
}
NOTA: datos es un array con los src de las imágenes.

PROBLEMA: Pues que no me funciona... cuando el usuario pulsa en la imagen minimizada, no se muestra rapidamente la imagen maximizada; sino que el navegador hace una petición y tiene que cargar la imagen...

No sé si es que hago algo mal, o no aplico bien la técnica...

Muchas gracias, saludos
  #2 (permalink)  
Antiguo 01/12/2009, 11:55
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Duda con precarga de imágenes

Hola:

no veo que compruebes que las imágenes estén totalmente cargadas... Aunque tengas en memoria todos los objetos "Image()" que tengas que usar, si no están cargadas no puedes tener la certeza de que se vean... estos objetos tienen la propiedad "complete" que se pone true cuando terminan de cargarse, y lanzan el evento load.

Saludis
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 01/12/2009, 14:44
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Duda con precarga de imágenes

Antiguamente usaba la función de DW:

Código javascript:
Ver original
  1. function MM_preloadImages() { //v3.0
  2.   var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
  3.     var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
  4.     if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
  5. }

Y en el onload hacía:

Código javascript:
Ver original
  1. MM_preloadImages('images/uno.gif','images/dos.gif');

A su vez en el contenedor le solía poner en algunos casos un gif animado de preload de background. Para obtener de estos gifs podés ver por ejemplo http://www.ajaxload.info.

No sé si es lo mejor o no, pero me era efectivo.

Saludos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #4 (permalink)  
Antiguo 02/12/2009, 06:27
 
Fecha de Ingreso: diciembre-2008
Mensajes: 100
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Duda con precarga de imágenes

Gracias a los dos por las respuestas, me han orientado muy bien sobre lo que quiero hacer. Pero sigo teniendo el mismo problema a pesar de comprobar que se han cargado todas las imágenes con el "complete" de todas las imágenes.

Basta con comprobarlo hasta que todas las imágenes tengan complete a true?? Luego no hace falta que haga nada con las imágenes??
El navegador sigue haciendo peticiones a las imágenes...

Voy a concretar más lo que hago:

1- Primero obtengo un array datos que tiene la ruta de las imágenes.
2- Llamo a preloadImagenes(datos)
Código javascript:
Ver original
  1. function preloadImagenes(datos)
  2. {
  3.     imageImagenes = new Array(datos.length-2);
  4.     boolImagenes = new Array(datos.length-2);
  5.     for(var i=0; i<imageImagenes.length; i++) // Se precargan todas las imagenes
  6.     {
  7.         var imagen = "imagenes/grande/"+datos[i];
  8.         imageImagenes[i] = new Image();
  9.         imageImagenes[i].src = imagen;
  10.         boolImagenes[i] = false;
  11.     }
  12.    
  13.     comprobarCargadas();
  14. }
Que inicializa los arrays imageImagenes (con los objetos Image), boolImagenes (que contiene el valor booleano que confirma si una imagen a sido cargada o no) y contImagenes (un valor entero que cuenta las que han sido cargadas).

3- La anterior llama a comprobarCargadas.
Código javascript:
Ver original
  1. function comprobarCargadas()
  2. {
  3.     if (contImagenes == imageImagenes.length) //Cuando están todas cargadas
  4.         {              
  5.             alert("todas");
  6.             //for(var i=0; i<imageImagenes.length; i++)
  7.                 //$("#img-cache").append("<img src=\""+imageImagenes[i].src+"\"></img>");
  8.             return;
  9.         }
  10.     for (var i=0; i<imageImagenes.length; i++)
  11.         if(boolImagenes[i]==false && imageImagenes[i].complete) // Se ha cargado imageImagenes[i]
  12.         {
  13.             boolImagenes[i] = true;
  14.             contImagenes++;
  15.         }
  16.     setTimeout("comprobarCargadas()", 10);
  17. }

Que comprueba recursivamente si se han cargado todas.

4- Añado las fotos en elementos img de la siguiente forma:

Código javascript:
Ver original
  1. for (var i=2; i<datos.length; i++)
  2. {
  3.     cadena += "<img class='miniImagen' src='imagenes/mini/"+datos[i]+"' onClick='document.getElementById(\"imagenGrande\").src=\"imagenes/grande/"+datos[i]+"\");' title="+datos[i]+" alt="+datos[i]+" ></img>";
  4.         }
Estos son los elementos que contienen los thumbails de las imágenes grandes. Cuando se pinche en uno de ellos quiero que se muestre en otro elemento la imagen grande... no sé si el problema está en que la imagen no se carga hasta que se hace click... pero también he probado a añadirlas en un elemento oculto y nada. Cuando hago click el navegador sigue haciendo peticiones...

No entiendo que es lo que pasa... es como si no funcionara la precarga... Lo siento por el rollazo, pero quería explicarme bien. ¿Alguna solución o propuesta?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:15.