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

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

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

Ответ 1

Вам нужно добавить обработчик нагрузки в обратном вызове 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 );
      }
});

Ответ 2

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

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

$.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);
    }                     
});

Ответ 3

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

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