0

我在使用带有 ajax 调用的 jQuery Masonry 插件时遇到问题。

我有一个过滤器功能,它从服务器获取一些非常标准的 html 内容(div,没有图像):

var searchResults   = $('div#results');

function filter() {

    var text        = 'text';
    var orderby     = 'order';
    var source      = 'source';
    var media       = 'media';
    var format      = 'format';
    var tags        = 'tags';

    var fetchUrl    = '/search/results/ ' + text + '/' + orderby + '/' + source + '/' + media + '/' + format + '/' + tags;


    $.ajax({
            type: "POST",
            url: fetchUrl,
            cache: false,
            data: "after=000000",
            success: function(data){ 

                searchResults.html(data);

                $('#results').masonry({
                  columnWidth: 360, 
                  itemSelector: '.related' 
                });
            }
        });

}

然后在页面加载时调用它,如下所示:

if (searchResults.length > 0) {

    filter();

}   

这一切都按预期工作。但是,当我尝试filter()通过单击调用时,它的内容很好,但砌体没有格式化它:

$('nav#view-types a#grid, nav#view-types a#list').click(function() {

    filter();

    return false;

});

当我在 Ajax 成功函数中调用 masonry 并且它正在第一次运行时,我真的看不出问题可能是什么......有人有什么想法吗?

谢谢!

詹姆士

4

2 回答 2

3

在 ajax 加载完成后,您需要告诉砌体“重新启动”:

例子:

$( document ).ajaxComplete(function() {
  console.log("Ajax finished"); //remove this if you want, useful for debugging
      $(document).ready(function() {
      $('#content').masonry({
       columnWidth: 260, //change this accordingly
       itemSelector: '.item'
      });
    });
});

Masonry 有一个 .reload() 但我发现它并没有很好地工作,除非你在附加或前置。要在完全更改内容时调用它,我必须这样做。

也许这里有更好的解决方案:

$(document).ready(function() {
      $('#admin_content').masonry({
       columnWidth: 260,
       itemSelector: '.masonry-item',
       isAnimated:true,
                animationOptions: {
                    duration: 500,
                    easing:'swing',
                    queue :false
               }
      });
    });
$( document ).ajaxComplete(function() {
    $('#admin_content').masonry('reloadItems').masonry();
});
于 2013-09-15T16:26:47.980 回答
1

附加项目后,您需要调用 $('#results').masonry('reload') 。

于 2011-09-10T20:30:55.307 回答