Как добавить АКТИВНЫЙ класс в список подменю, если элемент основного меню активен?

#javascript

#javascript

Вопрос:

Я изо всех сил пытаюсь исправить эту проблему. Я создал навигацию с основными пунктами меню на основе основного меню, в котором вы нажимаете на подменю с пунктами меню, которые должны отображаться, в которых содержатся данные для этого пункта меню.

Заголовок подменю меняется, но я хочу переключаться между подменю add active и remove при переключении назад и вперед.

Мой JS:

 (() => {
    const header = document.getElementById('header');
    const headerHamburger = header.querySelector('.header__hamburger');

    const headerMenu = header.querySelector('.header__menu');
    const headerMenuText = headerMenu.querySelector('span');

    const navigation = document.querySelector('.navigation');
    const navigationSideMenu = navigation.querySelector(
        '.navigation__sidemenu'
    );

    const navigationSideItems = [
        ...document.querySelectorAll('.navigation__item')
    ];

    const navigationSubList = document.querySelector('.navigation__sublist');

    const navigationTitle = document.querySelector('.navigation__title');

    const toggleSubMenu = (item, e) => {
        e.preventDefault();

        const link = item.querySelector('.navigation__link');
        const active = document.querySelector('.navigation__link--active');

        if (active) {
            active.classList.remove('navigation__link--active');
        }

        e.currentTarget.classList.add('navigation__link--active');

        navigationTitle.innerHTML = link.innerText;
    };

    navigationSideItems.forEach((item, i) => {
        item.addEventListener('click', toggleSubMenu.bind(null, item));
    });

    const toggleMenu = (e) => {
        e.preventDefault();

        headerHamburger.classList.toggle('active');

        if (headerMenu.getAttribute('data-open') === headerMenuText.innerHTML) {
            headerMenuText.innerHTML = headerMenu.getAttribute('data-close');
            navigation.classList.add('navigation--active');
        } else {
            headerMenuText.innerHTML = headerMenu.getAttribute('data-open');
            navigation.classList.remove('navigation--active');
        }
    };

    headerMenu.addEventListener('click', toggleMenu);
})();
  

Мой HTML:

  <div class="navigation">
        <div class="navigation--inner">
          <div class="wrapper">
                <div class="navigation--content">
                    <aside class="navigation__sidemenu">
                        <ul class="navigation__list">
                            <li class="navigation__item"><a class="navigation__link navigation__link--active" href="#"><i class="navigation__arrow"></i> Zero Emissie Stadslogistiek</a></li>
                            <li class="navigation__item"><a class="navigation__link" href="#"><i class="navigation__arrow"></i> Kennis</a></li>
                            <li class="navigation__item"><a class="navigation__link" href="#"><i class="navigation__arrow"></i> Tips amp;amp; tools</a></li>
                            <li class="navigation__item"><a class="navigation__link" href="#"><i class="navigation__arrow"></i> Doe mee!</a></li>
                            <li class="navigation__item"><a class="navigation__link" href="#"><i class="navigation__arrow"></i> Community</a></li>
                            <li class="navigation__item"><a class="navigation__link" href="#"><i class="navigation__arrow"></i> Over ons</a></li>
                        </ul>
                    </aside>
                    <main class="navigation__menu">
                        <h2 class="navigation__title">Zero Emissie Stadslogistiek</h2>
                        <ul data-menu="1" class="navigation__sublist">
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Alles over Zero Emissie Stadslogistiek</a></li>
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Stappenplan ZES</a></li>
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Convenant ZES</a></li>
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> ZES-Zone en toegangseisen<span></span></a></li>
                        </ul>

                        <ul data-menu="2" class="navigation__sublist">
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Alles over kennis</a></li>
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Stappenplan kennis</a></li>
                            <li class="navigation__subitem"><a class="navigation__sublink" href="#"><i class="navigation__arrow"></i> Convenant kennis</a></li>
                        </ul>
                    </main>
                </div>
          </div>
        </div>
    </div>
  

Моя локальная среда: http://00cfad965a36.ngrok.io /

Как я могу это исправить?

Ответ №1:

Ваш обратный вызов для e.target point at <li> не <a> убедитесь, что вы обновили статический класс для первого просмотра.

Попробуйте обновить свой оператор с помощью этого кода

 if (active) { 
active.classList.remove('navigation__link--active');
e.currentTarget.classList.add('navigation__link--active');
} 
// No match occurred 
else {            
e.currentTarget.classList.add('navigation__link--active');         
}
  

Реализация активного класса

 // Capture all elements of <a> output should be in an array
var triggers = document.getElementsByClassName("navigation__link");

// Create new variable i stands for index to be used in for loop
var i;

// Loop through all elements been found in box variable  
for (i = 0; i < triggers.length; i  ) {

// Add Event Listener of Click for <a> elements found in the variable box
  triggers[i].addEventListener("click", function(e) {

// Add e in callback function trace the element triggered this event
// In other words, which button has been clicked

var clicked = 
    e.target;

// default active element otherwise or else will not remove any active class

    if (document.querySelector(".active")) { 
document.querySelector(".active").classList.remove("active");

document.querySelector(clicked).classList.toggle("active");  
  
// Not found any active css class (box)                                      
    } else {
document.querySelector(clicked).classList.toggle("active");  
}
    })
  };
  

Живой пример: codepen.io