2016-01-15 11 views
0

Я пытаюсь понять это. Я использую вызов AJAX для заполнения div содержимым (divs, содержащие локально сохраненные изображения и текст). Ajax-вызов выполняется успешно, но divs во второй строке частично перекрывают те, что указаны в первой строке.Каменная кладка и перекрывающиеся divs

Вот сценарий, я работаю с:

var $allF = $('#allItems'); 

$(document).ready(function() { 

    $allF.imagesLoaded(function() { 
     $allF.masonry({ 
      itemSelector: '.box', 
      isAnimated: true, 
      animationOptions: { 
       duration: 500, 
       easing: 'linear', 
       queue: false 
      }, 
      isFitWidth: true, 
      columnWidth: 10 
     }); 
    }); 

    loadAllItems(); 

}); 

function loadAllItems() { 
    $.ajax({ 
     url: '/Ajax/LoadAllItems', 
     type: 'POST', 
     dataType: 'json', 
     data: { skip: (pageIndex * pageSize), take: pageSize }, 
     success: function (posts) { 
      var items = ''; 
      $.each(posts, function(p, post) { 
       items += 'html removed to keep post short'; 
      }); 

      var $itemBlock = $(items); 
      $allF.append($itemBlock); 
      $allF.masonry('appended', $itemBlock); 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      console.log(xhr.status); 
      console.log(xhr.responseText); 
      console.log(thrownError); 
     } 
    }); 
} 

Все элементы контента имеют одинаковую ширину 130 пикс, но высота каждого элемента может изменяться на целых 20 до 30 пикселей. Есть что-то, что я пропустил? Я пробовал Q & A на кладке, но безрезультатно.

Любая помощь была бы принята с благодарностью.

Спасибо!

+2

Скорее всего, вы столкнулись с этой проблемой, потому что изображения не загружается при обновлении кладки, вы должны перезагрузить кладку после того, как изображения были полностью загружены. Используйте https://github.com/desandro/imagesloaded, что –

+0

@SaqibAmin Благодарим за комментарий. Я проверю его здесь в нескольких. Один вопрос: jquery.masonry.min.js, как представляется, содержит определение для imagesLoaded - в чем разница между этим и тем, что вы предложили? –

+1

Нет никакой разницы. В вашем пакете уже есть библиотека с загруженной картинкой, вам не нужно ее снова загружать. –

ответ

2

Написать свою функцию Ajax, как показано ниже:

function loadAllItems() { 
    $.ajax({ 
     url: '/Ajax/LoadAllItems', 
     type: 'POST', 
     dataType: 'json', 
     data: { skip: (pageIndex * pageSize), take: pageSize }, 
     success: function (posts) { 
      var items = ''; 
      $.each(posts, function(p, post) { 
       items += 'html removed to keep post short'; 
      }); 

      var $itemBlock = $(items); 
      $allF.append($itemBlock); 
      $allF.imagesLoaded(function() { 
       $allF.masonry('appended', $itemBlock); 
      }); 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      console.log(xhr.status); 
      console.log(xhr.responseText); 
      console.log(thrownError); 
     } 
    }); 
} 
+1

Спасибо за помощь. Хотя, мне нужно иметь дополнительные $ allF.masonry ('appended', $ itemBlock); после проверки изображений? Я удалил его и, похоже, работает нормально. Еще раз спасибо. –

+1

Извините, я по ошибке оставил эту линию. Удалив это. –

Смежные вопросы