Невозможно изменить слайды JQuery lightSlider по номеру индекса элемента

Я создаю эту страницу: 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);


Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
655
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваши коды в каком-то беспорядке. Я внес много изменений, но, надеюсь, это сработает, если вы подставите свой код в свой четвертый тег <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, чтобы анимация не мешала событиям светового ползунка. Но я работаю над всеми вашими комментариями и предупреждениями! Так что еще раз большое спасибо, вы действительно мне очень помогли! ♥

Julio Pimentel 24.12.2020 15:21

Другие вопросы по теме