2009-04-17 19 views
29

Si tengo una serie de nombres de archivo de imagen,¿Cuál es la mejor manera de precargar múltiples imágenes en JavaScript?

var preload = ["a.gif", "b.gif", "c.gif"]; 

y quiero cargar previamente en un bucle, es necesario crear un objeto de imagen cada vez? ¿Funcionarán todos los métodos enumerados a continuación? ¿Es uno mejor?

A.

var image = new Image(); 
for (i = 0; i < preload.length; i++) { 
    image.src = preload[i]; 
} 

B.

var image; 
for (i = 0; i < preload.length; i++) { 
    image = new Image(); 
    image.src = preload[i]; 
} 

C.

var images = []; 
for (i = 0; i < preload.length; i++) { 
    images[i] = new Image(); 
    images[i].src = preload[i]; 
} 

Gracias!

+4

¿Es un requisito estricto de que usted comienza con una serie de nombres de archivos? Si su objetivo es simplemente mejorar la experiencia del usuario, puede ser mejor con el uso de sprites CSS: http://www.alistapart.com/articles/sprites/ –

Respuesta

10

EDITAR:

En realidad, acabo de poner a prueba, y el Método A no funciona como se pretende:

Compruébelo usted mismo: http://www.rootspot.com/stackoverflow/preload.php

Si hace clic en el segundo Una vez que la página haya terminado de cargarse, la imagen debería aparecer instantáneamente porque estaba precargada, pero la primera no, porque no tuvo tiempo de cargar antes de que se cambiara la fuente. Interesante. Con este nuevo desarrollo, seguiría usando el Método C.

+1

Tengo dos preguntas (probablemente tontas) para agregar a los OP: ¿El Método A no significa que cada descarga debe terminar antes de que comience el siguiente? ¿C ofrece una ventaja al no esperar que termine cada descarga? –

+4

Ninguno de los métodos espera a que finalice la descarga; todos están configurando una propiedad del objeto Imagen.Las diferencias son que A usa una sola imagen varias veces, B crea imágenes separadas sin guardar las referencias a todas ellas, y C crea una imagen por precarga Y guarda la referencia. – ojrac

+0

Gracias por la aclaración. –

1

Si mal no recuerdo tuve problemas con la solución A que en realidad no estaba precargando en un navegador. Aunque no estoy 100% seguro.

Dado que los tiene todos codificados, ¿por qué no probarlos, incluso puede perfilarlos para ver cuál es el más rápido.

2

Siempre he usado el siguiente código, que también he visto utilizado por muchos otros sitios, por lo que haría que el supuesto de que este método es mas potente y es similar a su método de c

function MM_preloadImages() { //v3.0 
    var d=document; 
    if(d.images){ 
     if(!d.MM_p) d.MM_p=new Array(); 
     var i,j=d.MM_p.length,a=MM_preloadImages.arguments; 
     for(i=0; i<a.length; i++) 
      if (a[i].indexOf("#")!=0) { 
       d.MM_p[j]=new Image; d.MM_p[j++].src=a[i]; 
      } 
    } 
} 

Recomendaría crear un perfil de todos ellos con algo como firebug

+4

Creo que Dreamweaver genera este código, que explica el prefijo 'MM' (para Macromedia). –

3

El siguiente código parece funcionar para mí. Su basado en [A]

JQuery:

var gallery= ['img/1.png','img/2.png','img/3.png','img/4.png','img/5.png']; 

var preload_image_object=new Image(); 

// Solución:

$.each(gallery,function(i,c){preload_image_object.src=c.logo}) 

O

$.each(['img/1.png','img/2.png','img/3.png','img/4.png','img/5.png'],function(i,c){preload_image_object.src=c}) 
+1

es posible que desee utilizar la opción de formato de marcado. –

Cuestiones relacionadas