Reputation: 113
want to build a Dropdown Menu. On "click" the submenu should be toggle "show-subnav".
This is my code:
<ul class="mainnav">
<li>First<span class="toggle">+</span>
<ul class="subnav">
<li>Subnav I</li>
<li>Subnav II</li>
<li>Subnav III</li>
</ul>
</li>
<li>Second<span class="toggle">+</span>
<ul class="subnav">
<li>Subnav I</li>
<li>Subnav II</li>
<li>Subnav III</li>
</ul>
</li>
<li>Third</>
</ul>
and this is my JavaScript:
const toggle = document.querySelectorAll(".toggle");
toggle.forEach(plusButton => {
plusButton.addEventListener("click", () => {
// How could I get the child from the mainnav li
// to toggle a class like:
subnavi.classList.toggle("show-subnav");
});
});
I want to toggle a class to the specific submenu-ul. But always get only the first submenu-ul.
Thanks
Upvotes: 1
Views: 160
Reputation: 3623
Take a look at Node.parentElement and parentNode.children, and you will be able to get your <ul>
:
// Inside your forEach()
plusButton.addEventListener("click", function () {
// Get parent <li> of plusButton
let li = this.parentElement,
// Get <li> children (so <ul> should be in it right?)
liChildren = li.children;
// Filters liChildren to get your <ul>
});
The keyword this
will not reference the clicked plusButton
if you use an arrowed function.
Upvotes: 3
Reputation: 5878
This can be solved using parentElement
and querySelectorAll
:
const toggle = document.querySelectorAll(".toggle");
toggle.forEach(plusButton => {
plusButton.addEventListener("click", () => {
plusButton.parentElement.querySelectorAll(".subnav").forEach(subnavi => {
console.log(subnavi);
subnavi.classList.toggle("show-subnav");
});
});
});
<ul class="mainnav">
<li>First<span class="toggle">+</span>
<ul class="subnav">
<li>Subnav I</li>
<li>Subnav II</li>
<li>Subnav III</li>
</ul>
</li>
<li>Second<span class="toggle">+</span>
<ul class="subnav">
<li>Subnav I</li>
<li>Subnav II</li>
<li>Subnav III</li>
</ul>
</li>
<li>Third</li>
</ul>
Upvotes: 1