Знать, когда изображения загружаются в AJAX-ответе

у меня есть функция jQuery ajax, которая загружает некоторый контент в div, часть контента-изображения. Я хотел бы сказать, пока те изображения, которые только что загружены в мой ajax, не закончат загрузку, а затем запустите функцию, такую как показ содержимого. Таким образом, я не буду загружать содержимое в div, и изображения начнут загружаться. Я хочу, чтобы они были загружены, а затем поместить содержимое, или show() содержание в div.

Я видел много решений для этого, такие как используя .load(), но он, похоже, не работает для содержимого, загруженного с помощью ajax.

3 ответов


вам нужно добавить обработчик нагрузки в обратный вызов AJAX, чтобы он применялся к изображениям, которые загружаются через вызов AJAX. Можно также установить таймер для отображения содержимого через некоторый интервал, если изображения загружаются до применения обработчика нагрузки.

$.ajax({
     ...
     success: function(data) {
          var imageCount = $(data).filter('img').length;
          var imagesLoaded = 0;
          $(data).hide()
                 .appendTo('#someDiv')
                 .filter('img')
                 .load( function() {
                     ++imagesLoaded;
                     if (imagesLoaded >= imageCount) {
                        $('#someDiv').children().show();
                     }
                  });
          setTimeout( function() { $('#someDiv').children().show() }, 5000 );
      }
});

Это обновленная версия кода tvanfosson при условии.

вы должны убедиться, что imageCount переменная подсчитывает список узлов, а не строку, как это было в исходном коде, из которого я могу вывести:

$.ajax({
    url      : 'somePage.html',  
    dataType : "html",
    success  : function(data) {

        $(data).hide().appendTo('#someDiv');

        var imagesCount = $('#someDiv').find('img').length;
        var imagesLoaded = 0;

        $('#someDiv').find('img').load( function() {
            ++imagesLoaded;
            if (imagesLoaded >= imagesCount) {
                $('#someDiv').children().show();
            }
        });

        var timeout = setTimeout(function() {
            $('#someDiv').children().show();
        }, 5000);
    }                     
});

$("img").load() не будет работать, потому что изображения загружаются динамически; эта команда будет применяться только к изображениям на странице в то время.

использовать $("img").live("load") для отслеживания загрузки изображений.