Я создаю эту страницу: https://yuyotest.000webhostapp.com/design.html
Код не готов, я еще тестирую пару вещей, так что голые со мной с позицией скриптов ха-ха.
Ну дело в том, что в конце 1-го раздела 4 логотипа. Всякий раз, когда нажимается один из этих логотипов, всплывает модальное окно со ползунком (JQuery lightSlider).
У меня возникают ошибки консоли при попытке щелкнуть один из логотипов и заставить ползунок показывать номер слайда логотипа nth:child clicked. Получение номера ребенка отлично работает с .index(this) + 1);
но заставить ползунок отображать номер слайда «index + 1 слайд» работает только один раз, если я попытаюсь еще раз, консоль говорит Uncaught TypeError: Cannot read property 'goToSlide' of undefined.
Любые мысли о том, как решить эту проблему? Я думал о сбросе функции slider.goToSlide(slide_n);
, но, честно говоря, не знаю, как это сделать :(
Заранее спасибо!
$(".design-logos").click(function() {
var slide_n = ($('.design-logos').index(this) + 1);
if ($("#light-slider").hasClass("lightSlider")) {
} else {
var slider = $("#light-slider").lightSlider({
item: 1,
loop: true,
speed: 1,
enableDrag: false,
});
}
slider.goToSlide(slide_n);
Ваши коды в каком-то беспорядке. Я внес много изменений, но, надеюсь, это сработает, если вы подставите свой код в свой четвертый тег <script></script>
на странице с кодом ниже:
var slider;
$(document).ready(function() {
// modal in //
function modalIn() {
$(".jp-modal-wrapper").show();
$('body').addClass("body-ovf");
setTimeout(function() {
$(".projects-main-slider").addClass("projects-main-slider-in");
$('.blackdrop').addClass("blackdrop-in");
setTimeout(function() {
$('.jp-inner-modal').addClass("jp-inner-modal-in");
}, 350);
$('.carousel-item.active img').lazy({
effect: "fadeIn",
effectTime: 1000,
threshold: 0
});
}, 10);
};
// modal off //
function modalOff() {
$('.jp-inner-modal').removeClass("jp-inner-modal-in");
setTimeout(function() {
$('.blackdrop').removeClass("blackdrop-in");
}, 500);
setTimeout(function() {
$(".jp-modal-wrapper").hide();
$('body').removeClass("body-ovf");
}, 1000);
};
$(".blackdrop").click(function() {
modalOff();
});
$('body').keydown(function(e) {
if (e.keyCode == 27) {
modalOff();
}
});
// modal off //
$(".design-logos").click(function() {
var slide_n = ($('.design-logos').index(this) + 1);
// modal in //
modalIn();
setTimeout(function() {
if ($("#light-slider").hasClass("lightSlider")) {
} else {
slider = $("#light-slider").lightSlider({
item: 1,
loop: true,
speed: 1,
enableDrag: false,
});
}
setTimeout(function() {
slider.goToSlide(slide_n);
}, 301);
//else
}, 5);
function fadeSlideIn() {
$(".next").addClass("disable-button");
$(".projects-main-slider").addClass("projects-main-slider-mov");
}
function fadeSlideOut() {
$(".next").removeClass("disable-button");
$(".projects-main-slider").removeClass("projects-main-slider-mov");
}
$(".gotoslide").click(function () {
slider.goToSlide(2);
});
$(".next").click(function () {
fadeSlideIn();
const curSliderInd = slider.getCurrentSlideCount();
const nextSlide = curSliderInd == 4 ? 1 : curSliderInd + 1;
setTimeout(function () {
let curSliderInd = slider.getCurrentSlideCount();
slider.goToSlide(nextSlide);
}, 301);
setTimeout(function () {
fadeSlideOut();
}, 302);
});
$(".prev").click(function () {
fadeSlideIn();
const curSliderInd = slider.getCurrentSlideCount();
const nextSlide = curSliderInd == 1 ? 4 : curSliderInd - 1;
setTimeout(function () {
slider.goToSlide(nextSlide);
}, 301);
setTimeout(function () {
fadeSlideOut();
}, 302);
});
});
});
Комментарии к вашему коду:
Во-первых, ваш код не удался, потому что блок else
if ($("#light-slider").hasClass("lightSlider")) {
} else {
var slider = $("#light-slider").lightSlider({
item: 1,
loop: true,
speed: 1,
enableDrag: false,
});
}
не выполняется после того, как элемент light-slider
получил класс lightSlider
, то есть когда один из логотипов был нажат в первый раз. Но slider
объявлен в этом блоке, поэтому он становится undefined
, если блок else не выполняется первым. Предоставление slider
глобальной ссылки решает проблему. Это решение неприятно, но у меня нет времени погрузиться в это расширение jQuery, чтобы найти оптимальное обходное решение.
Во-вторых, поиграв некоторое время с вашей страницей, я обнаружил, что поведение методов goToPrevSlide()
и goToNextSlide()
как-то не соответствует ожиданиям. Таким образом, я отредактировал вызовы этих методов в обратных вызовах кнопок next
и prev
.
В-третьих, вы поместили некоторые определения ваших обратных вызовов в setTimeout
! Может быть, это просто из-за невнимательности, и я все равно развернул их. Есть и другие дефекты формата, которые мне некогда исправлять. Возможно, вам придется исправить их, чтобы избежать их последующей мести.
БОЛЬШОЕ СПАСИБО, я искренне ценю ваше время и помощь!!! Да, я знаю, что это беспорядок, ха-ха, кроме того, что я новичок в js, я пытаюсь понять функции! Я совершенно не понял, как работает предоставление слайдеру глобальной ссылки, мне придется поискать информацию об этом. Понравилось, как вы отредактировали звонки для следующего и предыдущего! наконец, я использую обратные вызовы setTimeout, чтобы анимация не мешала событиям светового ползунка. Но я работаю над всеми вашими комментариями и предупреждениями! Так что еще раз большое спасибо, вы действительно мне очень помогли! ♥