Je recherche un moyen rapide et facile de précharger des images avec JavaScript. J'utilise jQuery si c'est important.
Je l'ai vu ici ( 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" });
}
};
Mais ça a l'air un peu exagéré pour ce que je veux!
Je sais qu'il existe des plugins jQuery qui font cela, mais ils semblent tous un peu gros (en taille); J'ai juste besoin d'un moyen rapide, facile et court de précharger des images!
$.each(arguments,function(){(new Image).src=this});
Réponses:
Rapide et facile:
Ou, si vous voulez un plugin jQuery:
la source
$('<img />')
que crée juste un élément d'image en mémoire (voir lien ). Il semble que'$('<img src="' + this + '" />')
cela créerait réellement l'élément dans une DIV cachée, car il est plus "compliqué". Cependant, je ne pense pas que cela soit nécessaire pour la plupart des navigateurs.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
car de cette façon, toutes les images du document sont chargées en premier, il est probable qu'elles soient nécessaires en premier.load
événement avant de définir lesrc
juste au cas où l'image finirait de se charger avant que l'événement de chargement ne soit défini?$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Voici une version modifiée de la première réponse qui charge réellement les images dans DOM et les masque par défaut.
la source
hide()
est plus laconique quecss('display', 'none')
.Utilisez l' objet Image JavaScript .
Cette fonction vous permet de déclencher un rappel lors du chargement de toutes les images. Cependant, notez qu'il ne déclenchera jamais de rappel si au moins une ressource n'est pas chargée. Cela peut être facilement résolu en implémentant le
onerror
rappel et en incrémentant laloaded
valeur ou en gérant l'erreur.la source
onload
événement même si l'image est mise en cache? (Parce queimg.onload
est déclaré en premier). C'est ce que mes tests ont montré.JP, Après avoir vérifié votre solution, je rencontrais toujours des problèmes dans Firefox où il ne préchargeait pas les images avant de passer au chargement de la page. J'ai découvert cela en en mettant
sleep(5)
dans mon script côté serveur. J'ai implémenté la solution suivante basée sur la vôtre qui semble résoudre ce problème.Fondamentalement, j'ai ajouté un rappel à votre plugin de préchargement jQuery, afin qu'il soit appelé une fois que toutes les images sont correctement chargées.
Par intérêt, dans mon contexte, j'utilise ceci comme suit:
J'espère que cela aidera quelqu'un qui vient sur cette page de Google (comme moi) à la recherche d'une solution pour précharger les images sur les appels Ajax.
la source
checklist = this.length
Et dans la fonction dechecklist--
if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
devrait être.load(function() {...}).attr({ src: this })
sinon vous aurez des problèmes de mise en cache.Ce code jQuery d'une ligne crée (et charge) un élément DOM img sans le montrer:
la source
L'utilisation est assez simple:
http://jsfiddle.net/yckart/ACbTK/
la source
J'ai un petit plugin qui gère cela.
Cela s'appelle waitForImages et il peut gérer des
img
éléments ou n'importe quel élément avec une référence à une image dans le CSS, par exemplediv { background: url(img.png) }
.Si vous vouliez simplement charger toutes les images, y compris celles référencées dans le CSS, voici comment vous le feriez :)
la source
:visible
au sélecteur personnalisé.load
événement, lorsqu'il est appliqué aux images: "ne fonctionne pas de manière cohérente ni fiable entre les navigateurs". Comment le plugin a-t-il réussi à contourner cela?vous pouvez charger des images dans votre html quelque part en utilisant la
display:none;
règle css , puis les afficher quand vous le souhaitez avec js ou jqueryn'utilisez pas les fonctions js ou jquery pour précharger n'est qu'une règle css contre plusieurs lignes de js à exécuter
exemple: Html
Css:
jQuery:
Le préchargement d'images par jquery / javascript n'est pas bon car les images prennent quelques millisecondes à charger dans la page + vous avez des millisecondes pour que le script soit analysé et exécuté, surtout si ce sont de grandes images, il est donc préférable de les masquer en hml pour les performances, car l'image est vraiment préchargée sans être visible du tout, jusqu'à ce que vous le montriez!
la source
ce plugin jquery imageLoader ne fait que 1,39 ko
usage:
il y a aussi d'autres options comme si vous voulez charger les images de façon synchrone ou asychronique et un événement complet pour chaque image individuelle.
la source
allcomplete
rappel est exécuté une fois que le DOM est prêt. Il y a de fortes chances que le chargement des images se termine une fois que le DOM est prêt, mais il n'y a aucune raison de supposer. Je ne sais pas pourquoi vous pensez que les rappels sont magiques et sont exécutés après que le DOM soit prêt ... pouvez-vous expliquer d'où vous obtenez cela? Ce n'est pas parce que les images sont chargées que le DOM est prêtNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... il recommande directement ce que montre cette réponse.Un moyen rapide et sans plug-in de précharger des images dans jQuery et d'obtenir une fonction de rappel consiste à créer plusieurs
img
balises à la fois et à compter les réponses, par exempleNotez que si vous souhaitez prendre en charge IE7, vous devrez utiliser cette version légèrement moins jolie (qui fonctionne également dans d'autres navigateurs):
la source
Merci pour cela! Je voudrais ajouter un petit riff à la réponse du JP - je ne sais pas si cela va aider quelqu'un, mais de cette façon vous n'avez pas à créer un tableau d'images, et vous pouvez précharger toutes vos grandes images si vous nommez vos pouces correctement. C'est pratique car j'ai quelqu'un qui écrit toutes les pages en html, et cela leur assure une étape de moins - éliminant le besoin de créer le tableau d'images, et une autre étape où les choses pourraient être gâchées.
Fondamentalement, pour chaque image de la page, elle saisit le src de chaque image, si elle correspond à certains critères (c'est un pouce ou une image de page d'accueil), elle change le nom (une chaîne de base remplace dans l'image src), puis charge les images .
Dans mon cas, la page était pleine d'images de pouce toutes nommées quelque chose comme image_th.jpg, et toutes les grandes images correspondantes sont nommées image_lg.jpg. Le pouce vers grand remplace simplement le _th.jpg par _lg.jpg, puis précharge toutes les grandes images.
J'espère que cela aide quelqu'un.
la source
la source
J'utilise le code suivant:
la source
J'utiliserais un fichier Manifest pour dire aux navigateurs Web (modernes) de charger également toutes les images pertinentes et de les mettre en cache. Utilisez Grunt et grunt-manifest pour le faire automatiquement et ne vous inquiétez plus jamais des scripts de préchargement, des invalidateurs de cache, du CDN, etc.
https://github.com/gunta/grunt-manifest
la source
Cela fonctionne pour moi même dans IE9:
la source
Je voulais le faire avec une superposition personnalisée de l'API Google Maps. Leur exemple de code utilise simplement JS pour insérer des éléments IMG et la zone d'espace réservé pour l'image s'affiche jusqu'à ce que l'image soit chargée. J'ai trouvé ici une réponse qui a fonctionné pour moi: https://stackoverflow.com/a/10863680/2095698 .
Cela précharge une image comme suggéré précédemment, puis utilise le gestionnaire pour ajouter l'objet img après le chargement de l'URL img. La documentation de jQuery prévient que les images mises en cache ne fonctionnent pas bien avec ce code d'événement / gestionnaire, mais cela fonctionne pour moi dans FireFox et Chrome, et je n'ai pas à me soucier d'IE.
la source
.attr('src',value)
ne pas.attr('src',this)
juste pour le signaler :)
la source
this
à l'intérieur du rappel transmis à$.each
est affectée à la valeur en cours d'itération.$("div").each(function(i, el){ console.log(el == this);});
génère tous lestrue
s; L'itération sur le tableau semble se comporter différemment.5 lignes en coffeescript
la source
Pour ceux qui connaissent un peu le script d'action, vous pouvez vérifier le lecteur flash, avec un minimum d'effort, et créer un préchargeur flash, que vous pouvez également exporter vers html5 / Javascript / Jquery. Pour l'utiliser si le lecteur flash n'est pas détecté, consultez des exemples sur la façon de le faire avec le rôle YouTube sur le lecteur html5 :) Et créez le vôtre. Je n'ai pas les détails, car je n'ai pas encore commencé, si je n'ai pas oublié, je le posterai plus tard et j'essaierai un code Jquery standard pour le mien.
la source