Reputation: 1746
I want to trigger an event when a specific item is clicked in this nav-menu.
<div class="sidebar-menu">
<ul class="menu">
<li class="sidebar-title">Menu</li>
<li class="sidebar-item">
<a href="/" class="sidebar-link active">
<i class="bi bi-grid-fill"></i>
<span>Dashboard</span>
</a>
</li>
<li class="sidebar-item">
<a href="/Counter" class="sidebar-link">
<i class="bi bi-grid-fill"></i>
<span>Counter</span>
</a>
</li>
<li class="sidebar-item has-sub">
<a href="#" class="sidebar-link">
<i class="bi bi-stack"></i>
<span>Components</span>
</a>
<ul class="submenu ">
<li class="submenu-item ">
<a href="component-alert.html">Alert</a>
</li>
</ul>
</li>
</ul>
</div>
I want to run some code whenever a sidebar-item
is clicked but only if it doesn't contain the has-sub class as well.
This is my current approach:
let sidebarEl = document.getElementById("sidebar")
sidebarEl.addEventListener("click", function () {
var w = window.innerWidth;
if (w <= 991) {
sidebarEl.classList.remove("active");
}
});
This one works fine when I click anywhere within the sidebar. But how can I limit it to my scenario only?
Upvotes: 0
Views: 44
Reputation: 26
This works for me:
Be careful, you have to use class, not id as selector
let sidebarEl = document.getElementsByClassName("sidebar-item");
for(item in [...sidebarEl]){
console.log([...sidebarEl][item]);
[...sidebarEl][item].addEventListener("click", ev => {
console.log("add")
var w = window.innerWidth;
if (w <= 991) {
sidebarEl.classList.remove("active");
}
});
};
Upvotes: 0
Reputation: 1
You could add your 'click' Event Listener only to the relevant elements by using document.querySelectorAll(filter)
and specify your Filter as .sidebar-item:not(.has-sub)
Example:
window.addEventListener('load', (event) => {
var els = document.querySelectorAll('.sidebar-item:not(.has-sub)');
for(var i = 0; i<els.Length; i++){
var el = els[i];
el.addEventListener('click', (event) => {
//Your code here
});
}
});
<div class="sidebar-menu">
<ul class="menu">
<li class="sidebar-title">Menu</li>
<li class="sidebar-item">
<a href="/" class="sidebar-link active">
<i class="bi bi-grid-fill"></i>
<span>Dashboard</span>
</a>
</li>
<li class="sidebar-item">
<a href="/Counter" class="sidebar-link">
<i class="bi bi-grid-fill"></i>
<span>Counter</span>
</a>
</li>
<li class="sidebar-item has-sub">
<a href="#" class="sidebar-link">
<i class="bi bi-stack"></i>
<span>Components</span>
</a>
<ul class="submenu ">
<li class="submenu-item ">
<a href="component-alert.html">Alert</a>
</li>
</ul>
</li>
</ul>
</div>
Upvotes: 0
Reputation: 48610
You can check if the target
element is a list item (<li>
) and that it does not have the class has-sub
.
const sidebarMenuEl = document.querySelector('.sidebar-menu');
const onMenuClick = ({ target: { classList, innerText, tagName } }) => {
if (tagName === 'LI' && !classList.contains('has-sub')) {
console.log('Clicked on LEAF:', innerText);
}
};
sidebarMenuEl.addEventListener('click', onMenuClick);
.as-console-wrapper { max-height: 3rem !important; }
li {
border: thin dashed red;
padding: 0.25rem;
cursor: pointer;
font-size: smaller;
}
<div class="sidebar-menu">
<ul class="menu">
<li class="sidebar-title">Menu</li>
<li class="sidebar-item">
<a href="/" class="sidebar-link active">
<i class="bi bi-grid-fill"></i>
<span>Dashboard</span>
</a>
</li>
<li class="sidebar-item">
<a href="/Counter" class="sidebar-link">
<i class="bi bi-grid-fill"></i>
<span>Counter</span>
</a>
</li>
<li class="sidebar-item has-sub">
<a href="#" class="sidebar-link">
<i class="bi bi-stack"></i>
<span>Components</span>
</a>
<ul class="submenu ">
<li class="submenu-item ">
<a href="component-alert.html">Alert</a>
</li>
</ul>
</li>
</ul>
</div>
Upvotes: 1