Reputation: 536
This is a non-standard Bootstrap 4 menu with 3 levels. The third level menus are controlled by jQuery, and the problem is that they stay open after the top menu item is closed. I'm also using jQuery to remove the need to click on the menus to show the sub-menus. It's sort of a mess. And I can't really change the HTML as it is output by a menu walker.
Question: how can I close all flyout menu items and their submenus (like 27028) when the top level menu item (3381) is closed?
Question: And how I can remove the redundant click on a menu item (like 27028) to show submenu items?
Here's a fiddle: https://jsfiddle.net/s04ezjhr/
<ul id="menu-main-menu-admin" class="navbar-nav"><li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-3381" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-3381 dropdown">
<a title="Human Resources" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle" aria-haspopup="true">Human Resources <span class="caret"></span></a>
<ul role="menu" class=" dropdown-menu" >
<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-27077" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27077"><a title="Test Link" href="#" class="dropdown-item">Test Link</a></li>
<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-27028" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27028 dropdown"><a title="HR Reports" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle" aria-haspopup="true">HR Reports <span class="caret"></span></a>
<ul role="menu" class=" dropdown-menu" >
<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-27029" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27029"><a title="Change Of Status" href="https://example.com/change-of-status/" class="dropdown-item">Change Of Status</a></li>
<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-27031" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27031"><a title="Failure To Start" href="https://example.com/failure-to-start/" class="dropdown-item">Failure To Start</a></li>
<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement" id="menu-item-27032" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27032"><a title="Intent To Hire" href="https://example.com/intent-to-hire/" class="dropdown-item">Intent To Hire</a></li>
</ul>
</li>
</ul>
This is the jQuery that currently controls the third level menu items and the "show on hover" submenus:
$('.dropdown-menu a.dropdown-toggle').on('click', function(e) {
if (!$(this).next().hasClass('show')) {
$(this).parents('.dropdown-menu').first().find('.show').removeClass("show");
}
var $subMenu = $(this).next(".dropdown-menu");
$subMenu.toggleClass('show');
$(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
$('.dropdown-submenu .show').removeClass("show");
});
return false;
});
function toggleDropdown (e) {
const _d = $(e.target).closest('.dropdown'),
_m = $('.dropdown-menu', _d);
setTimeout(function(){
const shouldOpen = e.type !== 'click' && _d.is(':hover');
_m.toggleClass('show', shouldOpen);
_d.toggleClass('show', shouldOpen);
$('[data-toggle="dropdown"]', _d).attr('aria-expanded', shouldOpen);
}, e.type === 'mouseleave' ? 300 : 0);
}
$('body')
.on('mouseenter mouseleave','.dropdown',toggleDropdown)
.on('click', '.dropdown-menu a', toggleDropdown);
Upvotes: 1
Views: 682
Reputation: 2291
Problem in the current script is that it opens all drop-down menus when you hover it. You can easily fix this by limiting it top open only immediate child dropdown menu.
function toggleDropdown(e) {
const _d = $(e.target).closest('.dropdown'),
_m = $('> .dropdown-menu', _d);
setTimeout(function() {
const shouldOpen = e.type !== 'click' && _d.is(':hover');
_m.toggleClass('show', shouldOpen);
_d.toggleClass('show', shouldOpen);
$('[data-toggle="dropdown"]', _d).attr('aria-expanded', shouldOpen);
}, e.type === 'mouseleave' ? 300 : 0);
}
$('body')
.on('mouseenter mouseleave', '.dropdown', toggleDropdown)
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<ul class="navbar-nav" id="menu-main-menu-admin">
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-3381 dropdown" id="menu-item-3381" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a aria-haspopup="true" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" title="Human Resources">
Human Resources
<span class="caret">
</span>
</a>
<ul class="dropdown-menu" role="menu">
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27077" id="menu-item-27077" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a class="dropdown-item" href="#" title="Test Link">
Test Link
</a>
</li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27028 dropdown" id="menu-item-27028" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a aria-haspopup="true" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" title="HR Reports">
HR Reports
<span class="caret">
</span>
</a>
<ul class="dropdown-menu" role="menu">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27029" id="menu-item-27029" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a class="dropdown-item" href="https://example.com/change-of-status/" title="Change Of Status">
Change Of Status
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27031" id="menu-item-27031" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a class="dropdown-item" href="https://example.com/failure-to-start/" title="Failure To Start">
Failure To Start
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27032" id="menu-item-27032" itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement">
<a class="dropdown-item" href="https://example.com/intent-to-hire/" title="Intent To Hire">
Intent To Hire
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Upvotes: 4
Reputation: 813
Your Code In Two Change Needed..!
The needed changes are shown below.
Unclosed Html In your Code files.
you close </li> </ul> end of the file
Add one bootstrap script file in your code, because of boostrap - 4 required this script file.
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
above changes to your code work proper
Upvotes: 0