Мой javascript выглядит следующим образом:
<script type="text/javascript">
$(document).ready(function() {
// isotope
var $container = $('#content');
$container.imagesLoaded( function(){
$container.isotope({
filter: '*',
itemSelector : '.element',
getSortData : {
colors : function( $elem ) {
return $elem.find('.colors').text();
},
number : function( $elem ) {
return $elem.find('.number');
}
}
});
var $sortedItems = $container.data('isotope').$filteredAtoms;
// filter items when filter link is clicked
$('#filter a').click(function(){
alert("filter");
var selector = $(this).attr('data-filter');
$container.isotope({ filter: selector });
return false;
});
// sorting
$('#sort a').click(function(){
var sortType = $(this).attr('data-sort');
$container.isotope({ sortBy : sortType });
return false;
});
});
});
function updateContent(path, args) {
$.ajax({
url: (path+args),
type: "POST",
success: function( data ){
$(allCards).remove();
$("#content").html( data );
$('#content').isotope( 'reLayout', callback );
}
});
}
function callback() {
alert("success: "+$('#content').height());
}
</script>
Всякий раз, когда я использую функцию updateContent(), высота div #content становится 0. Я думаю, что может произойти условие гонки из-за того, что контент не был полностью загружен и инициализирован изотоп до загрузки следующего набора изображений.
Он работает нормально, когда я впервые загружаю документ. Однако, когда я загружаю новый набор изображений с помощью updateContent(), он устанавливает высоту div #content равным 0. В идеале я хотел бы иметь возможность загружать новый набор изображений, и изотоп будет инициализироваться, как это обычно бывает, и высота должна быть соответствующее значение для всех изображений, помещенных внутри div #content.
Следующая часть должна быть исправлена, и это то, что у меня есть до сих пор...
$(allCards).remove(); // remove all previous images
$("#content").html( data ); // load new images
$('#content').isotope( 'reLayout', callback ); // <- reinit isotope to manage the new images
В основном я бы хотел, чтобы он удалял все предыдущие изображения и загружал все новые изображения в данные, а изотоп работал с новыми изображениями.
Я решил проблему, добавив. Я делаю это так, чтобы люди не страдали, как я.
$("#content").isotope( 'remove', $(".element"), function(){
$("#content").prepend($(data)).isotope( 'reloadItems' ).isotope({ sortBy: 'original-order' });
});
Взгляните на http://isotope.metafizzy.co/docs/methods.html.
Во-первых, убедитесь, что разметка, добавленная к $ ("# content"), имеет класс.element. Если у них их нет, вам нужно добавить их к ним, прежде чем пытаться вставить их в контейнер изотопа.
Во-вторых, попробуйте использовать встроенный метод для удаления добавочных объектов
.isotope( 'addItems', $items, callback )
В вашем случае это будет:
$("#content").isotope( 'remove', $(".element"), function(){
$("#content").isotope( 'addItems', $(data), function(){
$("#content").isotope( 'reLayout' callback );
});
});
Вам, вероятно, не нужно использовать обратные вызовы из "remove" и "addItems", но без примера jsfiddle это трудно сказать.