Vanilla JS除了“活跃”之外的所有其他元素中删除了类。类

时间:2016-05-19 21:47:56

标签: javascript html css

我正在尝试使用Vanilla JavaScript构建一个下拉菜单,但我无法找到在单击的下拉菜单中添加一类活动的最佳方法,然后同时删除所有其他菜单来自兄弟元素的活跃类。

到目前为止,这就是我所拥有的JS:

var _dropdowns = [].slice.call(document.getElementsByClassName('main-menu-li_dropdown'));

            _dropdowns.forEach(function(dropdowns) {
                dropdowns.addEventListener('click', function( event ){
                    event.preventDefault();
                    console.log(this !== event.target);
                    this.classList.toggle('active');
                });
            });

这是我的标记:

<nav id="main-nav">
    <ul>
        <li class="main-menu-li_dropdown">
            <a href="">link</a>
            <ul class="sub-nav">
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
            </ul>
        </li>
        <li class="main-menu-li_dropdown">
            <a href="">link</a>
            <ul class="sub-nav">
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
            </ul>
        </li>
        <li class="main-menu-li_dropdown">
            <a href="">link</a>
            <ul class="sub-nav">
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
            </ul>
        </li>
        <li class="main-menu-li_dropdown">
            <a href="">link</a>
            <ul class="sub-nav">
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
            </ul>
        </li>
        <li class="main-menu-li_dropdown">
            <a href="">link</a>
            <ul class="sub-nav">
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
                <li><a href="">link</a></li>
            </ul>
        </li>
    </ul>
</nav>

1 个答案:

答案 0 :(得分:20)

您可以遍历所有项目并删除该类,然后将该类添加到单击的项目中。

以下是一个例子:

http://jsbin.com/rivogelaqu/edit?html,js,output

let dropDowns = Array.from(document.querySelectorAll('.main-menu-li_dropdown'));

const handleClick = (e) => {
  e.preventDefault();
  dropDowns.forEach(node => {
    node.classList.remove('active');
  });
  e.currentTarget.classList.add('active');

}

dropDowns.forEach(node => {
  node.addEventListener('click', handleClick)
});

修改:替代点按处理程序

这是一个替代的单击处理程序,它可以避免每次单击时出现循环,只检查元素。可能会更高效。

const handleClick = (e) => {
  e.preventDefault();
  const active = document.querySelector('.active');
  if(active){
    active.classList.remove('active');
  }
  e.currentTarget.classList.add('active');
}