Плагин, который написал @alex, почему-то не работает для меня ... Я не мог понять, почему. Но его код вдохновил меня на создание более легкого решения, которое работает для меня. Он использует обещания jquery. Обратите внимание, что в отличие от плагина @alex, он не пытается учесть фоновые изображения на элементах, только img elements.
// Fn to allow an event to fire after all images are loaded
$.fn.imagesLoaded = function () {
// get all the images (excluding those with no src attribute)
var $imgs = this.find('img[src!=""]');
// if there's no images, just return an already resolved promise
if (!$imgs.length) {return $.Deferred().resolve().promise();}
// for each image, add a deferred object to the array which resolves when the image is loaded (or if loading fails)
var dfds = [];
$imgs.each(function(){
var dfd = $.Deferred();
dfds.push(dfd);
var img = new Image();
img.onload = function(){dfd.resolve();}
img.onerror = function(){dfd.resolve();}
img.src = this.src;
});
// return a master promise object which will resolve when all the deferred objects have resolved
// IE - when all the images are loaded
return $.when.apply($,dfds);
}
Тогда вы можете использовать что-то вроде этого:
$.ajax({
cache: false,
url: 'ajax/content.php',
success: function(data) {
$('#divajax').html(data).imagesLoaded().then(function(){
// do stuff after images are loaded here
});
}
});
Надеюсь, это кому-нибудь пригодится.
Обратите внимание, что при использовании приведенного выше кода, если одно из изображений содержит ошибки (например, из-за неправильного URL-адреса), обещание все равно разрешается, а ошибка игнорируется. Это может быть тем, что вы хотите, но, в зависимости от вашей ситуации, вы можете вместо этого захотеть прервать все, что вы делаете, если изображение не загружается. В этом случае вы можете заменить строку ошибки следующим образом:
img.onerror = function(){dfd.reject();}
И поймать ошибку, как это:
$('#divajax').html(data).imagesLoaded().done(function(){
// do stuff after all images are loaded successfully here
}).fail(function(){
// do stuff if any one of the images fails to load
});