Запуск функции после добавления jquery

#javascript #jquery #ajax #dom

#javascript #jquery #ajax #dom

Вопрос:

У меня есть эта функция для вставки большего количества сообщений с изображениями на мою веб-страницу. После вставки изображений div, внутри которого находится изображение, изменяется на ту же ширину, что и изображение. Однако проблема, с которой я сталкиваюсь, заключается в том, что она запускается до загрузки изображений, поэтому размеры divs не изменяются.

Есть идеи, как я могу настроить ее на запуск при загрузке всех изображений?

 function load_more(url, page, page_name) {
    $.ajax({
        type: 'POST',
        url: "/app/load_more/"   page_name   "/pagename/"   url,
        data: 'id=testdata',
        dataType: 'json',
        cache: false,
        success: function (data) {
            $(".next").remove();
            $("#top").append(data['top']);
            $("#bottom").append(data['bottom']);
            $('.img-wrap').each(function () {
                if ($(this).find('img').attr('src') != "") {
                    $(this).animate({
                        width: $(this).find('img').css("width")
                    }, 300);
                }
            });
        }
    });
}
  

Ответ №1:

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

 $('.img-wrap').each(function() { 
  var div = $(this);
  var img = div.find('img');
  if (img.attr('src') != ""){
    img.on('load', function(){
      div.animate({
        width: img.css("width")
      }, 300);
    });
  }
});
  

Ответ №2:

В дополнение к тому, что упомянул Гуффа, я мог бы даже переместить не зависящую от данных часть вашего кода в .ajax complete обратный вызов:

  function load_more(url, page, page_name) {
     $.ajax({
         type: 'POST',
         url: "/app/load_more/"   page_name   "/pagename/"   url,
         data: 'id=testdata',
         dataType: 'json',
         cache: false,
         success: function (data) {
             $(".next").remove();
             $("#top").append(data['top']);
             $("#bottom").append(data['bottom']);
         },
         complete: function () {
             $('.img-wrap').each(function () {
                 var div = $(this);
                 var img = div.find('img');
                 if (img.attr('src') != "") {
                     img.load(function () {
                         div.animate({
                             width: img.css("width")
                         }, 300);
                     });
                 }
             });
         }
     });
 }
  

Ответ №3:

Существует событие onload для тегов img, которое запускается при загрузке изображения. Вы пробовали это

 $(document).on('load', 'img', function(){
// resize
});
  

вам также необходимо проверить атрибут complete и запустить событие load, если оно true

 var $img = $(this).find('img'); 
if ($(this).find('img').attr('src') != "" amp;amp; $img.get(0).complete){
    $img.trigger('load);
}