【问题标题】:Bootstrap 4 Menu: close all flyout menus when top menu item is closedBootstrap 4 Menu:关闭顶部菜单项时关闭所有弹出菜单
【发布时间】:2020-03-17 14:49:54
【问题描述】:

这是一个非标准的 Bootstrap 4 菜单,有 3 个级别。三级菜单由 jQuery 控制,问题是在顶部菜单项关闭后它们仍保持打开状态。我还使用 jQuery 来消除单击菜单以显示子菜单的需要。这有点乱。而且我无法真正更改 HTML,因为它是由 menu walker 输出的。

问题:当顶级菜单项 (3381) 关闭时,如何关闭所有弹出菜单项及其子菜单(如 27028)?

问题:以及如何删除对菜单项(如 27028)的多余点击以显示子菜单项?

这是一个小提琴: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>

这是当前控制第三级菜单项和“悬停时显示”子菜单的jQuery:

$('.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);

【问题讨论】:

标签: jquery css bootstrap-4


【解决方案1】:

当前脚本中的问题是,当您将其悬停时,它会打开所有下拉菜单。您可以通过将其限制为仅在顶部打开直接子下拉菜单来轻松解决此问题。

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/popper.js@1.16.0/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>

【讨论】:

    【解决方案2】:

    您的代码需要进行两次更改..!

    所需的更改如下所示。

    1. 在您的代码文件中未关闭的 Html。

      你关闭

    2. 文件结尾
    3. 在您的代码中添加一个引导脚本文件,因为 boostrap - 4 需要此脚本文件。

    对代码的上述更改正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多