msearch2 + masonry
Привет.
Вообщем у меня есть блок новостей. Все блоки складываются кирпичеком через скрипт masonry.js.
То есть когда страница загружается, срабатывает функция вызова скрипта и блоки нормально показываются.
Но когда делаешь фильтрацию новостей через msearch2 функция не срабатывает (из-за аякса).
Можно как-нибудь запускать функцию, каждый раз при фильтрации… или же есть более правильное решение?
Вообщем у меня есть блок новостей. Все блоки складываются кирпичеком через скрипт masonry.js.
То есть когда страница загружается, срабатывает функция вызова скрипта и блоки нормально показываются.
Но когда делаешь фильтрацию новостей через msearch2 функция не срабатывает (из-за аякса).
Можно как-нибудь запускать функцию, каждый раз при фильтрации… или же есть более правильное решение?
Комментарии: 11
А можно поподробней пожалуйста, не могу разобраться.
$(document).ajaxStop(function(){
//повторная инициализация masonry.js тут
});
Скорее
$(document).on('mse2_load', function() {
//повторная инициализация masonry.js тут
});
А подскажите пожалуйста, где это вызывать?
Оум… Ну смотрите:
У вас, наверняка, или внутри тега head или перед закрывающим тегом body есть строчки в духе:
У вас, наверняка, или внутри тега head или перед закрывающим тегом body есть строчки в духе:
<script type="text/javascript" src="https://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript" src="scripts/masonry.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#container').masonry(); //этим вы инициализируете ваш masonry скрипт
});
//здесь может быть еще код.
</script>
— в том месте, где написано «здесь может быть еще код», сразу после }); пишите:$(document).on('mse2_load', function() {
$('#container').masonry();
});
— ну и "$('#container').masonry();" нужно заменить на ваш вызов masonry, само собой.
Перепробовал, не получается
<script src="assets/js/masonry.pkgd.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#mse2_results').masonry({
columnWidth: 280,
itemSelector: '.grid_item',
gutter: 30
});
});
$(document).on('mse2_load', function() {
$('#mse2_results').masonry({
columnWidth: 280,
itemSelector: '.grid_item',
gutter: 30
});
});
</script>
Вызываю через mfilter:
[[!mFilter2?
&element=`pdoResources`
&parents=`22`
&filters=`tv|video`
&includeContent=`1`
&includeTVs=`img_preview,HitsPage`
&tpl=`tpl_video`
&tplOuter=`tpl_video_outer`
&tplFilter.row.default=`tpl_video_chekbox`
&tplFilter.outer.default=`tpl_video_filter`
]]
Если не проблемно — киньте линк на сайт.
И у masonry, похоже, есть свой метод для обновления — container.masonry(«reloadItems»);. Возможно, вам вызывать на событие on('mse2_load') нужно его.
И у masonry, похоже, есть свой метод для обновления — container.masonry(«reloadItems»);. Возможно, вам вызывать на событие on('mse2_load') нужно его.
Скинуть сайт сюда не могу, если только в личку…
Проблему решил, скидываю код:
Проблему решил, скидываю код:
<script>
function masonryFunc(){
var $container = $('#mse2_results');
$container.masonry({
columnWidth: 280,
itemSelector: '.grid_item',
gutter: 30,
isAnimated: true,
});
}
setTimeout(masonryFunc,300);
$(document).on('mse2_load', function() {
$('#mse2_results').masonry('destroy');
setTimeout(masonryFunc(),300);
});
</script>
Ну и отлично.
И да, если у вас будет время — посмотрите, все-таки, метод reload в этом скрипте — уничтожать и заново создавать древо, на мой взгляд, выглядит как костыль и грозит утечкой памяти.
И да, если у вас будет время — посмотрите, все-таки, метод reload в этом скрипте — уничтожать и заново создавать древо, на мой взгляд, выглядит как костыль и грозит утечкой памяти.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.