Плагин, который написал @alex, по какой-то причине не работал для меня ... Я не мог понять, почему. Но его код вдохновил меня придумать более легкое решение, которое работает для меня. Он использует обещания jquery. Обратите внимание: в отличие от плагина @alex, это не попытка учета фоновых изображений на элементах, а только элементов img.
// 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-адреса), обещание все равно разрешено, и ошибка игнорируется. Это может быть то, что вы хотите, но, в зависимости от вашей ситуации, вы можете вместо этого отказаться от того, что вы делаете, если изображение не загружается.В этом случае вы могли бы заменить OnError строку следующим образом:
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
});
Это отлично работает! Благодарю. –
Это прекрасно работает. Спасибо. – J82
похоже, что это может создать утечку памяти. каждый раз, когда вы делаете вызов ajax, вы создаете дубликат каждого изображения на странице в памяти и присоединяете событие к каждому новому объекту изображения, сохраняя объект изображения в памяти после выполнения функции imagesLoaded. Как только все объекты дублированного изображения загружаются, когда они удаляются из памяти? Непосредственно после выполнения обратного вызова события onload? –