I have a menu.
I want to add event listener to elements with class "menu-item-has-children"(which should also be a descendant of element with class "mobile-nav")
So I use the following codes:
function addEventListenerToAll(selector, type, listener)
{
[].forEach.call(document.querySelectorAll(selector), function(element) {
if (element) {
element.addEventListener(type, listener);
}
});
}
addEventListenerToAll(".mobile-nav .menu-item-has-children", "click", function(event) {
console.log("click event is invoked");
});
But it seems the code will add the listener to not only the qualified elements, but also the child elements inside the qualified elements.
I embed the codes below. You can see when click "Out customers" item, the child element but not qualified the selector, the "click event is invoked" will also appear. Why?
function addEventListenerToAll(selector, type, listener)
{
[].forEach.call(document.querySelectorAll(selector), function(element) {
if (element) {
element.addEventListener(type, listener);
}
});
}
addEventListenerToAll(".mobile-nav .menu-item-has-children", "click", function(event) {
console.log("click event is invoked");
});
.mobile-nav .menu-item-has-children {
background:green;
}
<nav class="main-navigation mobile-nav" role="navigation" style="display: block;">
<ul id="menu-main-menu" class="sf-menu mobile-menu">
<li id="menu-item-1294" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1294">
<a href="https://www.sybase-recovery.com/company/">
Company
<svg class="my-svg-inline--fa my-fa-w-10"><use href="/images/icons/icons.svg#facebook-f"></use></svg>
</a>
<ul class="sub-menu" style="display: block;">
<li id="menu-item-433" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-433">
<a href="https://www.sybase-recovery.com/our-customers/">Our Customers</a>
</li>
</ul>
</li>
</ul>
</nav>