简体   繁体   English

如果主菜单项处于活动状态,如何将 ACTIVE 类添加到子菜单列表中?

[英]How to add ACTIVE class to sub-menu list if primary menu-item is active?

I am struggling to fix this issue.我正在努力解决这个问题。 I have created navigation with primary menu items based on a primary menu in which you click on a sub-menu with menu items that should be displayed which holds the data for this menu item.我已经基于主菜单创建了带有主菜单项的导航,在该主菜单中,您可以单击带有应显示的菜单项的子菜单,该菜单项包含该菜单项的数据。

The Submenu title is changing but I want to switch between sub-menu add active and remove when you switch back and forth.子菜单标题正在更改,但我想在来回切换时在子菜单添加活动和删除之间切换。

My JS:我的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);
})();

My HTML:我的 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; 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>

My local environment: http://00cfad965a36.ngrok.io/我的本地环境:http: //00cfad965a36.ngrok.io/

How can I fix this?我怎样才能解决这个问题?

Your callback for e.target point at <li> not <a> make sure you update static class for first view.您对e.target点的回调<li>而不是<a>确保您更新静态类以进行第一次查看。

Try to update your statement with this code尝试使用此代码更新您的语句

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');         
}

Active Class Implementation活动类实现

// 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");  
}
    })
  };

Live Example: codepen.io现场示例: codepen.io

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM