
francisco
¿La función que escribí a continuación es suficiente para precargar imágenes en la mayoría, si no en todos, los navegadores que se usan comúnmente en la actualidad?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
Tengo una matriz de URL de imágenes que recorro y llamo al preloadImage
función para cada URL.

Huzi — Javiator
Si. Esto debería funcionar en todos los principales navegadores.

clintgh
Prueba esto, creo que esto es mejor.
var images = [];
function preload() {
for (var i = 0; i < arguments.length; i++) {
images[i] = new Image();
images[i].src = preload.arguments[i];
}
}
//-- usage --//
preload(
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
)
Fuente: http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/

Alejandro
En mi caso, fue útil agregar una devolución de llamada a su función para onload
evento:
function preloadImage(url, callback)
{
var img=new Image();
img.src=url;
img.onload = callback;
}
Y luego envuélvalo para el caso de una matriz de URL a imágenes que se precargarán con devolución de llamada en todo lo que se hace:
https://jsfiddle.net/4r0Luoy7/
function preloadImages(urls, allImagesLoadedCallback){
var loadedCounter = 0;
var toBeLoadedNumber = urls.length;
urls.forEach(function(url){
preloadImage(url, function(){
loadedCounter++;
console.log('Number of loaded images: ' + loadedCounter);
if(loadedCounter == toBeLoadedNumber){
allImagesLoadedCallback();
}
});
});
function preloadImage(url, anImageLoadedCallback){
var img = new Image();
img.onload = anImageLoadedCallback;
img.src = url;
}
}
// Let's call it:
preloadImages([
'//upload.wikimedia.org/wikipedia/commons/d/da/Internet2.jpg',
'//www.csee.umbc.edu/wp-content/uploads/2011/08/www.jpg'
], function(){
console.log('All images were loaded');
});
Puede mover este código a index.html para precargar imágenes desde cualquier URL
<link rel="preload" href="https://via.placeholder.com/160" as="image">

mplungjan
Alternativa CSS2: http://www.thecssninja.com/css/even-better-image-preloading-with-css2
body:after {
content: url(img01.jpg) url(img02.jpg) url(img03.jpg);
display: none;
}
Alternativa CSS3: https://perishablepress.com/preload-images-css3/
(Presa H/T Linh)
.preload-images {
display: none;
width: 0;
height: 0;
background: url(img01.jpg),
url(img02.jpg),
url(img03.jpg);
}
NOTA: Imágenes en un contenedor con display:none
podría no precargarse. Quizás la visibilidad: oculta funcione mejor, pero no lo he probado. Gracias Marco Del Valle por señalar esto.
const preloadImage = src =>
new Promise(r => {
const image = new Image()
image.onload = r
image.onerror = r
image.src = src
})
// Preload an image
await preloadImage('https://picsum.photos/100/100')
// Preload a bunch of images in parallel
await Promise.all(images.map(x => preloadImage(x.src)))

dave
Te recomiendo que uses una prueba/captura para evitar algunos posibles problemas:
OOP:
var preloadImage = function (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
Estándar:
function preloadImage (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
Además, aunque me encanta DOM, los viejos navegadores estúpidos pueden tener problemas con el uso de DOM, así que evítelo por completo en mi humilde opinión, contrario a la contribución de freedev. Image() tiene un mejor soporte en los antiguos navegadores de basura.
Tenga en cuenta que algunos (¿todos?) navegadores publicarán la imagen después de unos segundos si no la ha usado. Para evitar esto, mantenga una referencia a la
img
objeto, por ejemplo, en una matriz en el ámbito principal.– Tamlyn
13 de octubre de 2014 a las 13:14
¿Qué quieres decir con “liberar la imagen”? Si el navegador lo almacenó en caché, permanecerá allí, ¿verdad?
– Francisco
17/10/2014 a las 19:07
Un poco más corto:
(new Image()).src = url;
– e382df99a7950919789725ceeec126
23/10/2014 a las 10:56
tenga en cuenta que esto no funcionará cuando chrome devtool esté abierto y ‘deshabilitar chache’ esté habilitado dentro del panel de red
– 牛さん
24 de enero de 2017 a las 4:11
Aún más corto:
new Image().src = url;
– Daniel X Moore
5 de diciembre de 2017 a las 17:29