Bootstrap 4 Меню: закрыть все всплывающие меню, когда закрыто главное меню - PullRequest
1 голос
/ 17 марта 2020

Это нестандартное Bootstrap 4 меню с 3 уровнями. Меню третьего уровня управляются jQuery, и проблема в том, что они остаются открытыми после закрытия верхнего элемента меню. Я также использую jQuery, чтобы убрать необходимость нажимать на меню, чтобы отобразить подменю. Это своего рода беспорядок. И я действительно не могу изменить HTML, поскольку он выводится с помощью меню.

Вопрос: как мне закрыть все элементы выпадающего меню и их подменю (например, 27028), когда элемент меню верхнего уровня ( 3381) закрыто?

Вопрос: А как я могу удалить лишний щелчок по пункту меню (например, 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, который в настоящее время контролирует элементы меню третьего уровня и подменю «show on hover»:

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

Ответы [ 2 ]

4 голосов
/ 21 марта 2020

Проблема в текущем скрипте состоит в том, что он открывает все раскрывающиеся меню при наведении на него курсора. Вы можете легко исправить это, ограничив его сверху, открывая только непосредственное дочернее выпадающее меню.

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>
0 голосов
/ 20 марта 2020

Необходим ваш код с двумя изменениями ..!

Необходимые изменения показаны ниже.

  1. Не закрыто Html В ваших файлах Code.

    вы закрываете

  2. Добавьте один bootstrap скрипт файл в вашем коде, так как boostrap - 4 требуется этот файл сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...