[英]Vanilla JS - Can add/remove class on child elements but all are active
[英]Vanilla JS remove class from all other elements besides 'active' class
我正在嘗試使用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>
您可以遍歷所有項目並刪除該類,然后將該類添加到單擊的項目中。
這是一個例子:
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');
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.