Next и prev в меню

190
04 марта 2019, 22:20

Есть меню, есть кнопки управления next и prev. Идея такая: при клике на пункт меню срабатывает определенное событие (например, фильтрация на клиенте) + сам пункт становится активным. При клике на next событие срабатывает на элементе, который следует сразу за активным пунктом и этот следующий пункт становится активным.
При клике на prev событие срабатывает на элементе, который находится перед активным пунктом и этот предыдущий пункт становится активным. Все это зациклено.

Пример здесь, реализация на jquery: https://codepen.io/Ilinykh/pen/MPGBXK

Проблема в следующем:

Если сначала выбрать пункт по клику на него, а потом начать нажимать на кнопки, то происходит рассинхрон и срабатывает не тот пункт, который должен срабатывать. На примере все должно быть понятно, прошу помочь.

 $(function(){
var $nav = $('.list'),
            $menuLink = $('.list').find('li a'),
            $currentItem = $menuLink.find('.active'),
            $prevBtn = $('.prev-btn'),
            $nextBtn = $('.next-btn');
  $menuLink.on('click', function () {
            $menuLink.removeClass('active');
            $(this).addClass('active');
        })
  $prevBtn.on('click', function (event) {
            event.preventDefault();
            event.stopImmediatePropagation();
            $nextBtn.removeClass('active');
            $(this).addClass('active');
            $currentItem = ($currentItem > 0) ? $currentItem - 1 :       $menuLink.length - 1;
            $menuLink.eq($currentItem).addClass('active');
            $menuLink.eq($currentItem).trigger('click');
        })

  $nextBtn.on('click', function (event) {
            event.preventDefault();
            event.stopImmediatePropagation();
            $prevBtn.removeClass('active');
            $(this).addClass('active');
            $currentItem = ($currentItem + 1 < $menuLink.length) ?       $currentItem + 1 : 0;
            $menuLink.eq($currentItem).addClass('active');
            $menuLink.eq($currentItem).trigger('click');
        })

});
Answer 1

Вы просто забываете обновлять currentItem, когда выбираете что-то в меню:

  $menuLink.on('click', function () {
            $menuLink.removeClass('active');
            $(this).addClass('active');
      $currentItem = $menuLink.index(this);  // Вот этой строчки вам не хватало
        })
READ ALSO
Закрытие меню по клику вне блока на vanila js

Закрытие меню по клику вне блока на vanila js

Помогите реализовать закрытие меню по клику вне блока на чистом Java Script везде примеры только на JQ, я стараюсь максимально обходиться без него

186
Асинхронность callback с return и throw

Асинхронность callback с return и throw

Подскажите пожалуйста минусы использования callback (помимо основных лапша в коде), и почему мы не можем использовать return и throw с callbackами (помимо...

180
JavaScript Оператор return

JavaScript Оператор return

Задача: вернуть средний символ словаЕсли длина слова нечетна, верните средний символ

183