JQuery Ajax дождаться загрузки всех изображений - PullRequest
37 голосов
/ 23 января 2011

Я пытаюсь выполнить Ajax-вызов с помощью jQuery, который работает хорошо.Я использую событие успеха для отображения данных.Однако кажется, что успех запускается, как только загружается внешний HTML-файл.Если есть большие изображения, они продолжают загружаться после показа.Есть ли способ отобразить контент после полной загрузки?Вот код:

$('#divajax').html('<br><div style="text-align: center;"><img src="res/ajax-loader.gif"></div>');
$.ajax({
    cache: false,
    url: 'ajax/content.php',
    success: function(data) {
          $('#divajax').html(data);
    }
});

Ответы [ 10 ]

46 голосов
/ 01 августа 2013

Плагин, который написал @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
});
17 голосов
/ 27 октября 2011

Вы можете использовать мой плагин jQuery, waitForImages ...

$.ajax({
    cache: false,
    url: 'ajax/content.php',
    success: function(data) {

         $('#divajax').html(data).hide().waitForImages(function() {
             $(this).show();
         });

    }
});

Это загрузит материал в ваш элемент, скроет его и затем покажет заново, как только потом переходит imgэлементы загружены.

10 голосов
/ 23 января 2011

Вы можете связать что-то с событиями загрузки, чтобы знать, когда они завершатся:

$('<img>').bind('load', function() {
    $(this).appendTo('body');
});

Или вы можете использовать этот плагин .

4 голосов
/ 01 июля 2014

это срабатывает при каждой загрузке img отдельно:

$('img').on('load', function() {
      // do something
});

я использовал:

var loaded = 0;
$('img').on('load', function() {
   loaded++;
   if(loaded == $('img').length){
      // do something
   }
});
2 голосов
/ 05 января 2015

Вы можете использовать плагин imagesloaded, который работает с JavaScript и jQuery, попробуйте использовать функцию обратного вызова в ajax success для загруженного контента и скрыть весь контент, пока imagesloaded функция обратного вызова не запускается, см. Пример кода

$.ajax({
    cache: false,
    url: 'ajax/content.php',
    success: function(data) {
        var $divajax = $('#divajax').html(data).hide();
        $divajax.imagesLoaded(function() {
             $divajax.show();
         });

    }
});
0 голосов
/ 17 сентября 2015

У меня есть небольшая ошибка, когда плагин из решения Дэниела не находит изображений.

На всякий случай, если другие получат такую ​​же проблему:

Изменение:

// if there's no images, just return an already resolved promise
if (!$imgs.length) {return $.Deferred.resolve().promise();}

Кому:

// if there's no images, just return an already resolved promise
    if (!$imgs.length) {
        var dfd = $.Deferred();
        return dfd.resolve().promise();
    }
0 голосов
/ 18 августа 2014

Попробуйте этот код. Работает нормально.

$.ajax({
    url: "../api/listings",
    type: 'GET',
    success: function (html) {
        $('#container').append(html);
        $('#container img').on('load', function(){console.log('images loaded')});
    };
});
0 голосов
/ 24 января 2011

Я думаю, что лучше всего использовать это

$(window).ready(function(){ //load your ajax})
0 голосов
/ 23 января 2011
$('#divajax').html('<br><div style="text-align: center;"><img src="res/ajax-loader.gif"></div>').load(function() {
$.ajax({
    cache: false,
    url: 'ajax/content.php',
    success: function(data) {
          $('#divajax').html(data);
    }
});
});
0 голосов
/ 23 января 2011

Изучите использование jquery's .load ()

Который имеет описание:

Событие загрузки отправляется элементу, когда он и все вложенные элементы полностью загружены. Это событие может быть отправлено любому элементу, связанному с URL-адресом: изображения, сценарии, фреймы, iframes и объект окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...