Jquery Masonry loading over each other after Ajax div refresh

Steve Robinson picture Steve Robinson · Jul 17, 2013 · Viewed 8.9k times · Source

I am using ajax to refresh a div containing images. I use masonry to add layout initially.

Then the ajax call returns a js that refreshes the div using the html() method. Now after it completes I am calling masonry('reloadItems'). But masonry loads all images onto one another. After a page resize it works. I tried manually triggering the page resize but it doesnt make masonry make the adjustments.

JS:

$('#timerange-select, #category_select').bind('change', function() {
    form=$('#images-filter-form');
    $.get(form.action, form.serialize(),function(){
      var $container = $('#images_container');
      $container.imagesLoaded(function(){$container.masonry('reloadItems');});
      $(window).trigger('resize');
    }, 'script');
 });

OKay the response of this ajax request is:

$('#images_container').html('<%= escape_javascript(render("shared/random_issues")) %>');

So I am not appending the images. I am replacing the container to be precise. enter image description here

This is actually 10 images loaded on each other.

EDIT: See http://stackoverflow.com/questions/17697223/masonry-images-overlapping-above-each-other/17697495?noredirect=1#17697495 for css and html.

Answer

Steve Robinson picture Steve Robinson · Aug 2, 2013

Okay I seemed to have solved the problem.

I obtained the masonry object by using:

var masonry = $('#issue_container').data('masonry');

Now using this method I called reloadItems() and then layout(). After first method call every item overlaps onto each other in one tile and then after calling layout() a nice masonry layout is formed. The animation of moving from top-left corner into a nice layout also seems nice :D.