Reputation: 86
I am building an on click dropdown menu in WordPress. Everything is working as it should but I am stumped on one feature. The dropdown menu expands and collapses on click by toggling a "show" class. I also need to add functionality to hide an expanded dropdown if another parent nav item is clicked. This way 2 drop downs will never be open at the same time. Code is below, thank you.
HTML
<ul id="primary-nav">
<li class="menu-item-has-children">Parent Nav Item One
<!-- if Parent Nav Item Two is clicked and this sub-menu is visible, hide this sub-menu -->
<ul class="sub-menu">
<li class="menu-item-has-children">Drop Down Item
<ul class="sub-menu">
<li>Drop Down Sub Item</li>
<li>Drop Down Sub Item</li>
</ul>
</li>
<li>Drop Down Item</li>
</ul>
<li class="menu-item-has-children">Parent Nav Item Two
<!-- if Parent Nav Item One is clicked and this sub-menu is visible, hide this sub-menu -->
<ul class="sub-menu">
<li>Drop Down Item</li>
<li>Drop Down Item</li>
</ul>
</li>
</ul>
JS
$('#primary-nav .menu-item-has-children').click(function() {
$('> .sub-menu', this).toggleClass('show');
});
Upvotes: 1
Views: 1209
Reputation: 37701
Just hide them all first, while keeping the state of the clicked one so you can toggle it:
$('#primary-nav .menu-item-has-children').click(function() {
var state = $('> .sub-menu', this).hasClass('show');
$('#primary-nav .menu-item-has-children .sub-menu').removeClass('show');
$('> .sub-menu', this).toggleClass('show', !state);
});
.sub-menu {display: none}
.sub-menu.show {display: block}
.menu-item-has-children {cursor: pointer}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="primary-nav">
<li class="menu-item-has-children">Parent Nav Item One
<!-- if Parent Nav Item Two is clicked and this sub-menu is visible, hide this sub-menu -->
<ul class="sub-menu">
<li class="menu-item-has-children">Drop Down Item
<ul class="sub-menu">
<li>Drop Down Sub Item</li>
<li>Drop Down Sub Item</li>
</ul>
</li>
<li>Drop Down Item</li>
</ul>
<li class="menu-item-has-children">Parent Nav Item Two
<!-- if Parent Nav Item One is clicked and this sub-menu is visible, hide this sub-menu -->
<ul class="sub-menu">
<li>Drop Down Item</li>
<li>Drop Down Item</li>
</ul>
</li>
</ul>
Upvotes: 3