D'attente pour le chargement des images avec JQuery
J'ai essayer d'attendre pour les images fini de charger, mais il semble que l'événement load est jamais égalés.
Voici mon code :
$(function() {
var arrowWidth = 22;
var currentImageID = -1;
var imageOffsets = new Array();
var loadedImages = 0;
var numberOfImages = $("div#sliderGallery > ul > li").size();
$("div#sliderGallery > ul").hide();
$("div#sliderGallery").append("<div id=\"loading\"></div>");
$("div#sliderGallery > div#loading").append("Chargement en cours ...<br>");
$("div#sliderGallery > div#loading").append("<img src=\"progressbar.gif\" />");
function setOffset(imageID) {
if (imageID != currentImageID) {
$("ul#slide_items > li > img#"+currentImageID).fadeTo(0, 0.2);
currentImageID = imageID;
$("ul#slide_items > li > img#"+currentImageID).fadeTo("slow", 1);
$("div#sliderGallery > ul").css("left", imageOffsets[imageID][0]+"px");
$("div#slideGallery > span.arrow").css("width", imageOffsets[imageID][1]+"px");
$("div#sliderGallery > span#left").css("left", imageOffsets[imageID][2]+"px");
$("div#sliderGallery > span#right").css("left", imageOffsets[imageID][3]+"px");
}
}
$("div#sliderGallery > ul > li > img").load(function() {
alert("never executed ...");
loadedImages++;
if (loadedImages == numberOfImages) {
$("div#sliderGallery > div#loading").remove();
$("div#sliderGallery").css("overflow", "hidden");
$("div#sliderGallery > ul").show();
$("div#sliderGallery").append("<span id=\"left\" class=\"arrow\"><img src=\"arrow_left.png\" /></span>");
$("div#sliderGallery").append("<span id=\"right\" class=\"arrow\"><img src=\"arrow_right.png\" /></span>");
$("div#slideGallery > span.arrow").fadeTo(0, 0.5);
$("div#slideGallery > span.arrow").css("padding-top", Math.round((600-146)/2)+"px");
var ulWidth = $("div#sliderGallery").innerWidth();
var imageID = 0;
var imageWidthSum = 0;
$("div#sliderGallery > ul > li > img").each(function() {
image = jQuery(this);
image.attr("id", imageID);
image.fadeTo(0, 0.2);
imageOffsets[imageID] = new Array();
//Offset applied to images
imageOffsets[imageID][0] = Math.round(ulWidth/2-(imageWidthSum+image.innerWidth()/2));
//Width applied to span
imageOffsets[imageID][1] = Math.round(image.innerWidth()/2+arrowWidth);
//Offset apply to the left span
imageOffsets[imageID][2] = Math.round($("div#sliderGallery").offset().left+ulWidth/2-imageOffsets[imageID][1]);
//Offset apply to the right span
imageOffsets[imageID][3] = imageOffsets[imageID][1]+imageOffsets[imageID][2];
imageID++;
imageWidthSum += image.innerWidth();
});
setOffset(0);
}
});
});
Et le code html :
texte du lien
Pourquoi cette ligne d'alerte "("ne jamais exécuté ...");" n'a pas été exécuté ?
Merci d'avance, je suis en train de devenir folle avec ce problème 🙂
J'ai reçu la boîte d'alerte avec FF3.5
Même avec FF 3.0, mais seulement la première fois que j'ouvre la page ... pas la prochaine fois ...
Même avec FF 3.0, mais seulement la première fois que j'ouvre la page ... pas la prochaine fois ...
OriginalL'auteur Fabien Engels | 2009-07-08
Vous devez vous connecter pour publier un commentaire.
Avec IE l'événement onload sur des images semble être problématique.
En plus de joindre gestionnaire d'événement onload, pour chaque image, vous pouvez essayer de vérifier si l'attribut
complete
est égal àtrue
.Cela peut marche aussi pour les images mises en cache.
OriginalL'auteur tanathos
J'ai écrit un plugin qui tire des rappels lorsque le descendant d'images ont fini de télécharger. Une sorte de localisé
window.onload
.Il est appelé waitForImages et d'utilisation est...
Readme.
Il peut également être configuré pour attendre pour les images référencées dans le CSS.
OriginalL'auteur alex
Cela peut ne pas être la réponse à votre problème, mais je remarque que vous faites référence à div#slideGallery et div#sliderGallery. Ce sont ces deux séparés divs ou est-ce une faute de frappe?
Je reçois le message d'alerte avec IE 8
C'était une faute de frappe erreur, corrigez maintenant, Mais il n'a rien changé. alerte de code est exécutée la première fois que la page est ouverte, mais la prochaine visite, le code n'est pas exécuté ... une Fois que les images sont mises en cache, l'événement de chargement ne fonctionne plus ...
OriginalL'auteur Jack
De la docs:
Pouvez-vous mettre dans un $(document).prêt()?
OriginalL'auteur RedWolves
Vous avez besoin de vérifier si toutes les images sont déjà chargés (qui se passe sur des connexions rapides ou si elle est chargée à partir du cache) en comparant numberOfImages à $("div#sliderGallery > ul > li > img").longueur juste après que vous avez enregistré le gestionnaire onload. La plupart des navigateurs n'feu de la manifestation si les images ont fini de se charger, après le gestionnaire est enregistrée, un peu de feu, même si il a déjà fini le chargement avant, mais je ne voudrais pas compter sur cela. Depuis que vous faites habituellement ces initialisations sur $(document).prêt() vous piège dans ce problème le plus souvent même sans doute parce qu'ils ont une bonne quantité d'images chargées avant.
Pour des raisons de simultanéité vous pouvez également ajouter un indicateur booléen être activé et vérifiées au moment de l'incendie du bloc (de mieux en faire une fonction) pour obtenir exécutée si le préchargement a fini ou de l'exécution de ce bloc plusieurs fois.
Aussi assurez-vous de ne pas utiliser votre intérieur loadedImages compteur car il ne peut jamais compter de la totalité de la valeur pour les raisons ci-dessus. Mieux vaut $("div#sliderGallery > ul > li > img").la longueur de chaque temps.
Je ne sais pas si c'est pertinent, mais quand j'ai codé un preloader je l'ai enregistré avec jQuery $().chaque fonction à l'aide .onload directement pour chaque image. Peut-être il y avait un problème de dos ou alors je ne savais pas par $().de la charge. Vous pouvez essayer si cela fait une différence.
OriginalL'auteur Energiequant