Не корректно выводится слайдер через AjaxSnippet
Добрый день!
Не корректно выводится слайдер при загрузке через AjaxSnippet. Без AjaxSnippet все работает и отображается как положено. Подскажите пожалуйста решение.
Вывожу так:
Не корректно выводится слайдер при загрузке через AjaxSnippet. Без AjaxSnippet все работает и отображается как положено. Подскажите пожалуйста решение.
Вывожу так:
[[!AjaxSnippet?
&snippet=`pdoResources`
&resources=`getTickets`
&parents=`1893`
&limit=`10`
&includeTVs=`image`
&tpl=`tpl.gallery.big`
]]
На выходе получаю это:Комментарии: 9
Полагаю, что инициализация слайдера происходит в основном DOM -дереве, при событии document.ready. А тело слайдера грузится позже. Соответственно, скрипт инициализации не видит подгруженную разметку слайдера, ее просто нет в основном DOM-е.
bezumkin.ru/sections/components/2557/
Тут указано, что есть событие as_complete, которое происходит при загрузке ajaxSnippet. Попробуйте на это событие повесить инициализацию слайдера.
Тут указано, что есть событие as_complete, которое происходит при загрузке ajaxSnippet. Попробуйте на это событие повесить инициализацию слайдера.
$(document).on('as_complete', document, function(e,d) {
//код инициализации
});
К сожалению не помогло
$(document).on('as_complete', document, function(e,d) {
slider_demo2.slick({
slidesToShow: 1,
slidesToScroll: 1,
arrows: false,
fade: true,
asNavFor: '.slider_demo1'
});
});
Ошибки есть в консоли браузера?
Ошибок нет
переменная slider_demo2 должна объявляется внутри этого кода, иначе slider_demo2 наверняка пустая.
Так выглядит вся инициализация главного слайдера и зависимого:
if ($('.slider_demo2').length > 0) {
var slider_demo2 = $('.slider_demo2');
var slider_demo1 = $('.slider_demo1');
$(document).on('as_complete', document, function(e,d) {
slider_demo2.slick({
slidesToShow: 1,
slidesToScroll: 1,
arrows: false,
fade: true,
asNavFor: '.slider_demo1'
});
});
slider_demo1.slick({
slidesToShow: 7,
slidesToScroll: 1,
asNavFor: '.slider_demo2',
dots: false,
prevArrow: "<div class='slider_arrow arrow_left'><i class='fal fa-angle-left'></i></div>",
nextArrow: "<div class='slider_arrow arrow_right'><i class='fal fa-angle-right'></i></div>",
centerMode: true,
focusOnSelect: true,
responsive: [{
breakpoint: 10000,
settings: {
slidesToShow: 7,
slidesToScroll: 1,
infinite: true,
}
}, {
breakpoint: 1300,
settings: {
slidesToShow: 6,
slidesToScroll: 1,
infinite: true,
}
}, {
breakpoint: 1024,
settings: {
slidesToShow: 7,
slidesToScroll: 1,
infinite: true,
}
}, {
breakpoint: 600,
settings: {
slidesToShow: 3,
slidesToScroll: 1
}
}, {
breakpoint: 480,
settings: {
slidesToShow: 2,
slidesToScroll: 1
}
}]
});
}
Поясняю
var slider_demo2 = $('.slider_demo2');
var slider_demo1 = $('.slider_demo1');
эти две строчки как бы принимают объекты, но т.к. у вас из-за ajaxsnippet нет объектов $('.slider_demo2'); и $('.slider_demo1'); их физечески не существует при загрузке страницы, то переменные пусты или не объявлены. Соответственно, присвоение эти переменных должно происходить в as_complete, т.е. когда ajaxsnippet загрузит данные и в странице появится slider_demo2.
Более того ваше первое условие
if ($('.slider_demo2').length > 0) {
Говорит о том что если такого объекта slider_demo2 не существует, то не выполнять этот код.
Надеюсь тут все ясно станет.
var slider_demo2 = $('.slider_demo2');
var slider_demo1 = $('.slider_demo1');
эти две строчки как бы принимают объекты, но т.к. у вас из-за ajaxsnippet нет объектов $('.slider_demo2'); и $('.slider_demo1'); их физечески не существует при загрузке страницы, то переменные пусты или не объявлены. Соответственно, присвоение эти переменных должно происходить в as_complete, т.е. когда ajaxsnippet загрузит данные и в странице появится slider_demo2.
Более того ваше первое условие
if ($('.slider_demo2').length > 0) {
Говорит о том что если такого объекта slider_demo2 не существует, то не выполнять этот код.
Надеюсь тут все ясно станет.
Накидал на тестовом сайте
вызов сниппета:
Чанк, который отдает сниппет my_slider:
Код в футере:
Всё прекрасно отрабатывает на тестовом варианте. Значит, осталось разобраться, что именно нужно инициализировать на событие as_complete, как выше написал Константин.
вызов сниппета:
[[AjaxSnippet?
&snippet=`my_slider`
&as_mode=`onload`
]]
Чанк, который отдает сниппет my_slider:
<div class="slider single-item">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
Код в футере:
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="vendor/js/slick-theme.css"/>
<link rel="stylesheet" type="text/css" href="vendor/js/slick.css"/>
<script src="vendor/js/slick.js"></script>
<script>
$(document).on('as_complete', document, function(e,d) {
$('.single-item').slick();
});
</script>
Всё прекрасно отрабатывает на тестовом варианте. Значит, осталось разобраться, что именно нужно инициализировать на событие as_complete, как выше написал Константин.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.