2013-02-08 1 views
2

Я использую Twitter Bootstrap и jQuery Masonry для нового сайта в разработке. Я добавляю новые элементы в контейнер кладки.jQuery masonry - метод вызова после перезагрузки кладки

элементы не являются ни добавляться или предваряется существующих детей, но в вставленный между ними, в зависимости от порядка сортировки, как это:

var elem = $(boxes[rand2]); 
$(".post").each(function(i){ 
    if(parseFloat($(this).data("weight"))<=weight){ 
     elem.insertBefore(this); 
     return false; 
    } 
    else if (i == $(".post").length - 1) { 
     elem.insertAfter(this); 
     return false; 
    } 
}); 

Это отлично работает до сих пор. То, что я хотел бы достичь, состоит в том, что элементы отображаются только тогда, когда они достигли места назначения. Я не хочу отключать анимацию, но пространство для нового элемента должно появиться (пустое), и только когда все будет переделано через кладку, должен появиться новый элемент.

Я думал, что будет обратный вызов действия, который срабатывает после перезагрузки, как это:

$('#posts').masonry('reload',function(){ 
    alert('re-aligning finished'); 
}); 

, но это не работает, он стреляет рано.

Так на данный момент, я

$('#posts').masonry('reload',function(){ 
    window.setTimeout(showElem,500); 
}); 
function showPosts(){ 
    $('.post').show(); 
} 

и что, кажется, работает - но фиксированный 500мс тайм-аут не является реальным красивое решение ...

Таким образом, любые предложения?

ответ

0

Я предполагаю, что вы уже используете jQuery. Возможно, полезно использовать объекты deferred.

+0

Ммм выглядит интересно, но я не понимаю, как использовать его в этом контексте ... –

+0

вы можете создать jsfiddle того, что вы пытаетесь решить? Я предполагаю, что функция .masonry является отложенным объектом. так что просто привязка к этому с помощью .done() может работать ... но я не уверен, вернет ли он отложенную. попробуйте это – Lucas

+0

к сожалению это не сработает :(Может быть, я просто придерживаюсь своего таймаута в 500 мс, это не * что * плохо, но не красиво –

0

Не могли бы вы сделать это позже после загрузки документов?

(function($) { 
$(document).ready(documentReadyFunction); 
$(window).resize(windowResizeFunction); 
$(window).load(windowLoadFunction); 
function documentReadyFunction() { 
    //your inserted html here 
} 
function windowResizeFunction() { 
    //resize here 
} 
function windowLoadFunction() { 
    //do masonry here 
} 
})(jQuery);