¿La función que escribí a continuación es suficiente para precargar imágenes en la mayoría, si no en todos, los navegadores de uso común hoy en día?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
Tengo una matriz de URL de imágenes que recorro y llamo a la preloadImage
función para cada URL.
javascript
Francisc
fuente
fuente
img
objeto, por ejemplo, en una matriz en el ámbito primario.(new Image()).src = url;
new Image().src = url;
Respuestas:
Si. Esto debería funcionar en todos los principales navegadores.
fuente
Prueba esto, creo que esto es mejor.
Fuente: http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/
fuente
onload
controlador para ninguna de las imágenesonload
estado o simplemente está creando instancias de imágenes en la memoria.for (var i = 0.....
var
En mi caso, fue útil agregar una devolución de llamada a su función para el
onload
evento:Y luego envolverlo para el caso de una matriz de URL a imágenes para ser precargadas con devolución de llamada en todo: https://jsfiddle.net/4r0Luoy7/
fuente
Alternativa CSS2: http://www.thecssninja.com/css/even-better-image-preloading-with-css2
Alternativa CSS3: https://perishablepress.com/preload-images-css3/ (Presa H / T Linh)
NOTA: Las imágenes en un contenedor con
display:none
podrían no precargarse. Quizás visibilidad: oculto funcionará mejor, pero no lo he probado. Gracias Marco Del Valle por señalar estofuente
display: none
no se precargarán.display: none
, (2) no uséwidth/height: 0
, (3) putno-repeat
y una posición tal que la imagen estaría afuera (lo-<width>px -<height>px
llevará allí, por lo que si sus imágenes son 100px en altura o menos, puede usar0 -100px
, en otras palabrasurl(...) no-repeat 0 -100px
.Le recomiendo que use un try / catch para evitar algunos posibles problemas:
OOP:
Estándar:
Además, aunque me encanta DOM, los navegadores viejos y estúpidos pueden tener problemas con el uso de DOM, así que evítelo por completo en mi humilde opinión contraria a la contribución de freedev. Image () tiene mejor soporte en navegadores de basura viejos.
fuente
Este enfoque es un poco más elaborado. Aquí almacena todas las imágenes precargadas en un contenedor, puede ser un div. Y después, podría mostrar las imágenes o moverlas dentro del DOM a la posición correcta.
Pruébalo aquí , también he agregado algunos comentarios
fuente
fuente
Sí, esto funcionará, sin embargo , los navegadores limitarán (entre 4 y 8) las llamadas reales y, por lo tanto, no almacenarán en caché / precargarán todas las imágenes deseadas.
Una mejor manera de hacer esto es llamar a onload antes de usar la imagen de esta manera:
fuente
Aquí está mi enfoque:
fuente
Solución para navegadores compatibles con ECMAScript 2017
Nota: esto también funcionará si está utilizando un transpilador como Babel.
También podría haber esperado a que se cargaran todas las imágenes.
O use
Promise.all
para cargarlos en paralelo.Más sobre promesas .
Más acerca de las funciones "Async" .
Más sobre la tarea de desestructuración .
Más sobre ECMAScript 2015 .
Más sobre ECMAScript 2017 .
fuente
Puedo confirmar que el enfoque en la pregunta es suficiente para activar las imágenes que se descargarán y almacenarán en caché (a menos que haya prohibido que el navegador lo haga a través de sus encabezados de respuesta) en, al menos:
Para probar esto, hice una pequeña aplicación web con varios puntos finales que cada uno duerme durante 10 segundos antes de servir una foto de un gatito. Luego agregué dos páginas web, una de las cuales contenía una
<script>
etiqueta en la que cada uno de los gatitos está precargado usando lapreloadImage
función de la pregunta, y la otra incluye todos los gatitos en la página usando<img>
etiquetas.En todos los navegadores anteriores, descubrí que si primero visité la página del precargador, esperé un rato y luego fui a la página con el
<img>
etiquetas, mis gatitos se mostraban al instante. Esto demuestra que el precargador cargó con éxito los gatitos en el caché en todos los navegadores probados.Puede ver o probar la aplicación que usé para probar esto en https://github.com/ExplodingCabbage/preloadImage-test .
Tenga en cuenta en particular que esta técnica funciona en los navegadores anteriores, incluso si el número de imágenes que se superponen excede el número de solicitudes paralelas que el navegador está dispuesto a hacer a la vez, al contrario de lo que sugiere la respuesta de Robin . La velocidad a la que las imágenes de precarga, por supuesto, estará limitada por la cantidad paralelo pide al navegador está dispuesto a enviar, pero será finalmente solicitar a cada URL de la imagen se llama
preloadImage()
sucesivamente.fuente
Puede mover este código a index.html para precargar imágenes desde cualquier url
fuente
El navegador funcionará mejor usando la etiqueta de enlace en la cabeza.
fuente