Estoy buscando una manera rápida y fácil de precargar imágenes con JavaScript. Estoy usando jQuery si eso es importante.
Vi esto aquí ( http: //nettuts.com ... ):
function complexLoad(config, fileNames) {
for (var x = 0; x < fileNames.length; x++) {
$("<img>").attr({
id: fileNames[x],
src: config.imgDir + fileNames[x] + config.imgFormat,
title: "The " + fileNames[x] + " nebula"
}).appendTo("#" + config.imgContainer).css({ display: "none" });
}
};
Pero, ¡parece un poco exagerado lo que quiero!
Sé que hay complementos de jQuery que hacen esto, pero todos parecen un poco grandes (en tamaño); ¡Solo necesito una forma rápida, fácil y corta de precargar imágenes!
$.each(arguments,function(){(new Image).src=this});
Respuestas:
Rápido y fácil:
O, si quieres un complemento jQuery:
fuente
$('<img />')
solo crea un elemento de imagen en la memoria (ver enlace ). Parece'$('<img src="' + this + '" />')
que en realidad crearía el elemento dentro de un DIV oculto, porque es más "complicado". Sin embargo, no creo que esto sea necesario para la mayoría de los navegadores.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
porque de esa manera todas las imágenes del documento se cargan primero, es probable que se necesiten primero.load
evento antes de configurarlosrc
en caso de que la imagen termine de cargarse antes de configurar el evento de carga?$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Aquí hay una versión modificada de la primera respuesta que realmente carga las imágenes en DOM y las oculta de forma predeterminada.
fuente
hide()
es más concisa decss('display', 'none')
.Usar objeto de imagen de JavaScript .
Esta función le permite activar una devolución de llamada al cargar todas las imágenes. Sin embargo, tenga en cuenta que nunca activará una devolución de llamada si no se carga al menos un recurso. Esto se puede solucionar fácilmente implementando la
onerror
devolución de llamada e incrementando elloaded
valor o manejando el error.fuente
onload
evento incluso si la imagen está en caché? (Porqueimg.onload
se declara primero). Esto es lo que mostraron mis pruebas.JP, después de verificar su solución, todavía tenía problemas en Firefox donde no precargaba las imágenes antes de continuar con la carga de la página. Descubrí esto poniendo algunos
sleep(5)
en mi script del lado del servidor. Implementé la siguiente solución basada en la suya que parece resolver esto.Básicamente agregué una devolución de llamada a su complemento de precarga de jQuery, para que se llame después de que todas las imágenes se carguen correctamente.
Por interés, en mi contexto, estoy usando esto de la siguiente manera:
Esperemos que esto ayude a alguien que viene a esta página desde Google (como yo) buscando una solución para precargar imágenes en llamadas Ajax.
fuente
checklist = this.length
Y en la función dechecklist--
if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
De lo.load(function() {...}).attr({ src: this })
contrario, tendrá problemas de almacenamiento en caché.Este código jQuery de una línea crea (y carga) un elemento DOM img sin mostrarlo:
fuente
El uso es bastante simple:
http://jsfiddle.net/yckart/ACbTK/
fuente
Tengo un pequeño complemento que maneja esto.
Se llama waitForImages y puede manejar
img
elementos o cualquier elemento con una referencia a una imagen en el CSS, por ejemplodiv { background: url(img.png) }
.Si simplemente desea cargar todas las imágenes, incluidas las referenciadas en el CSS, así es como lo haría :)
fuente
:visible
al selector personalizado.load
evento, cuando se aplica a las imágenes: "no funciona de manera consistente ni confiable entre navegadores". ¿Cómo se las arregló el plugin para solucionarlo?puedes cargar imágenes en tu html en algún lugar usando la
display:none;
regla css , luego mostrarlas cuando quieras con js o jqueryno use las funciones js o jquery para precargar es solo una regla css Vs muchas líneas de js para ejecutar
ejemplo: HTML
Css:
jQuery:
La precarga de imágenes por jquery / javascript no es buena porque las imágenes tardan unos pocos milisegundos en cargar en la página + usted tiene milisegundos para que el script se analice y ejecute, especialmente si son imágenes grandes, por lo que ocultarlas en hml es mejor también para el rendimiento, ¡porque la imagen está realmente precargada sin ser visible en absoluto, hasta que lo demuestres!
fuente
este complemento jquery imageLoader es solo 1.39kb
uso:
También hay otras opciones, como si desea cargar las imágenes de forma síncrona o asíncrona y un evento completo para cada imagen individual.
fuente
allcomplete
devolución de llamada se ejecuta después de que el DOM esté listo. Existe una buena posibilidad de que las imágenes terminen de cargarse después de que el DOM esté listo, pero no hay razón para suponer. No sé por qué piensas que las devoluciones de llamada son mágicas y se ejecutan después de que el DOM está listo ... ¿puedes explicar de dónde lo sacas? El hecho de que las imágenes estén cargadas no significa que el DOM esté listoNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... recomienda directamente lo que muestra esta respuesta.Una forma rápida y sin complementos de precargar imágenes en jQuery y obtener una función de devolución de llamada es crear varias
img
etiquetas a la vez y contar las respuestas, por ejemploTenga en cuenta que si desea admitir IE7, deberá usar esta versión un poco menos bonita (que también funciona en otros navegadores):
fuente
¡Gracias por esto! Me gustaría agregar un pequeño riff en la respuesta del JP: no sé si esto ayudará a alguien, pero de esta manera no tiene que crear una matriz de imágenes, y puede precargar todas sus imágenes grandes si nombra tus pulgares correctamente. Esto es útil porque tengo a alguien que está escribiendo todas las páginas en html, y garantiza un paso menos para ellos, eliminando la necesidad de crear la matriz de imágenes y otro paso en el que las cosas podrían arruinarse.
Básicamente, para cada imagen en la página, toma el src de cada imagen, si coincide con ciertos criterios (es un pulgar o imagen de la página de inicio) cambia el nombre (una cadena básica reemplaza en el src de la imagen), luego carga las imágenes .
En mi caso, la página estaba llena de imágenes de pulgar, todas denominadas algo así como image_th.jpg, y todas las imágenes grandes correspondientes se denominan image_lg.jpg. El pulgar a grande simplemente reemplaza el _th.jpg con _lg.jpg y luego precarga todas las imágenes grandes.
Espero que esto ayude a alguien.
fuente
fuente
Yo uso el siguiente código:
fuente
Usaría un archivo de manifiesto para indicarle a los navegadores web (modernos) que también carguen todas las imágenes relevantes y las almacenen en caché. Utilice Grunt y grunt-manifest para hacer esto automáticamente y nunca más se preocupe por los scripts de precarga, los invalidadores de caché, CDN, etc.
https://github.com/gunta/grunt-manifest
fuente
Esto funciona para mí incluso en IE9:
fuente
Quería hacer esto con una superposición personalizada de la API de Google Maps. Su código de muestra simplemente usa JS para insertar elementos IMG y el cuadro de marcador de posición de la imagen se muestra hasta que se carga la imagen. Encontré una respuesta aquí que funcionó para mí: https://stackoverflow.com/a/10863680/2095698 .
Esto precarga una imagen como se sugirió anteriormente, y luego usa el controlador para agregar el objeto img después de cargar la URL img. La documentación de jQuery advierte que las imágenes en caché no funcionan bien con este código de evento / controlador, pero me funciona en Firefox y Chrome, y no tengo que preocuparme por IE.
fuente
.attr('src',value)
no.attr('src',this)
solo para señalarlo :)
fuente
this
dentro de la devolución de llamada que se pasa$.each
se asigna al valor que se está iterando.$("div").each(function(i, el){ console.log(el == this);});
genera todos lostrue
s; La iteración sobre la matriz parece comportarse de manera diferente.5 líneas en coffeescript
fuente
Para aquellos que conocen un poco de actionscript, puede verificar flash player, con un mínimo esfuerzo, y hacer un precargador flash, que también puede exportar a html5 / Javascript / Jquery. Para usar si no se detecta el reproductor flash, consulte los ejemplos sobre cómo hacer esto con el rol de youtube de vuelta al reproductor html5 :) Y cree el suyo propio. No tengo los detalles, porque aún no he comenzado, si no lo olvido, lo publicaré más tarde y probaré un código Jquery estándar para el mío.
fuente