4

通过 Ajax 删除项目时如何刷新 Masonry?这是我用来删除项目的代码:

if($deletes = $('a[rel=delete]')) {
    $deletes.click(function() {
        if(!window.confirm('Are you sure you wish to delete this picture?'))
            return false;
        $t = $(this);
        $.post(
            $t.attr('href'),
            {},
            function(data) {
                if(data == "success")
                    $t.parents('.deleteable:first').fadeOut();
            }
        );
        return false;           
    });
}

我想要刷新的原因是在删除项目后消除产生的空格。

4

4 回答 4

5

为您添加一个回调,以便在它淡出后fadeOut()实际调用已删除的元素,然后再次调用容器。.remove().masonry()

于 2011-03-06T00:35:04.770 回答
1

我会说只是在选择器上再次调用它。它似乎有一个检查,看看它是否被再次调用。

...snip...
  // checks if masonry has been called before on this object
  props.masoned = !!$wall.data('masonry');
...snip...

我也会推荐该saveOptions设置,因为它似乎支持重新调用。没关系,它似乎默认这样做(D'oh!)

于 2011-03-05T23:52:21.147 回答
1

在淡出回调中再次调用 masonry。让自己轻松一点,并在函数中进行砌体初始化。在那里定义您的选项,这样您就不必将选项带入您的回调范围。

像这样

$(function(){

  var $bricks = $('your > elements');

  function BuildWall(){
    $bricks.masonry({your:'options'});
  }

  BuildWall();


 //Your code modified
 if($deletes = $('a[rel=delete]')) {
     $deletes.click(function() {
        if(!window.confirm('Are you sure you wish to delete this picture?'))
           return false;
         var $t = $(this);
         $.post(
            $t.attr('href'),
            {},
            function(data) {
                if(data == "success")
                    $t.parents('.deleteable:first').fadeOut(function(){
                       //This is faster than $(this).remove();
                       $(this).empty().remove();
                       //Reset Masonry
                       BuildWall();
                    });
            }
        );
        return false;           
    });
 }
});
于 2011-03-06T01:16:05.680 回答
1

jquery masonry 本身有一个删除方法(http://masonry.desandro.com/methods.html#remove

你可以把它放在你的 fadeOut 回调中:

$("your-container").masonry( 'remove', $(this) ).masonry();
于 2013-06-12T13:47:01.117 回答