Consultez http://jsfiddle.net/5uNGR/15/
Essayez quelque chose où vous n'essayez pas d'effectuer un fadeIn sur chaque image pendant leur chargement, mais testez la validité de l'image suivante dans votre file d'animation à chaque fois qu'un événement de chargement se produit, puis lors du rappel de l'animation, vérifiez si la suivante est prête. Voici un script qui devrait fonctionner.
À propos, consultez http://www.sajithmr.me/javascript-check-an-image-is-loaded-or-not pour plus d'informations sur le test de préparation des images.
$(function () {
// fonction utilitaire pour tester si l'image est correctement chargée
var isImgLoadOk = function (img) {
if (!img.complete) { return false; }
if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
return false;
}
return true;
};
$("a").on('click', function () {
$("#load").load('load.html', function () {
var imgs = $('#load img').hide(), //créer un tableau d'images et les masquer (enchaînement)
animIndex = 0, //position dans la file d'animation
isFading = false; //suivre l'état de savoir si une animation est en cours
// ceci est un gestionnaire de chargement ET est appelé dans le rappel de fadeIn si
// ce n'est pas la dernière image de la collection
var fadeNextImg = function () {
// vérifier qu'un événement de chargement ne s'est pas produit au milieu d'une animation
if (isFading) return;
// dernière image dans la file d'animation ?
var isLast = animIndex == imgs.length - 1;
// obtenir l'image brute de la collection et tester si elle est chargée correctement
var targetImage = imgs[animIndex];
if (isImgLoadOk(targetImage)) {
// transformer l'htmlImage en objet jQuery
targetImage = $(targetImage);
// incrémenter la file d'attente
animIndex++;
// définir l'état de l'animation - cela ignorera les événements de chargement
isFading = true;
// faire apparaître l'image
targetImage.fadeIn('slow', function () {
isFading = false;
// tester si l'image suivante est prête à être chargée en
// appelant récursivement la fonction parent
if (!isLast) fadeNextImg();
});
}
};
imgs.on('load', fadeNextImg);
});
return false;
});
});