Закрытие меню переключения не работает с кодом JQuery - PullRequest
0 голосов
/ 26 августа 2018

Я работаю над закрытием меню переключения для мобильных телефонов и имею небольшую проблему.Так что я хочу, чтобы при активном переключающем меню пользователь мог закрыть его, коснувшись где-нибудь экрана на своем устройстве.У меня почти все заработало, но при закрытии корзина в шапке исчезает, а в меню не появляется значок гамбургера.Я работаю над сайтом Wordpress, просто чтобы заметить.Я предполагаю, что проблема заключается в следующем: aria-extended = "true" , потому что значение по умолчанию должно быть ложным после того, как пользователь закрыл его.Итак, мой сайт: https://www.ngraveme.com/bg

мой код JQuery:

jQuery(document).ready(function($) {
  var $menu = $('.menu');


  $('.menu-toggle').click(function() {
    $menu.toggle();
  });

  $(document).mouseup(function(e) {
    if (!$menu.is(e.target) // if the target of the click isn't the container...
      &&
      $menu.has(e.target).length === 0) // ... nor a descendant of the container
    {
      $menu.hide();
    }
  });
});

и исходный код js, написанный из темы, которую я использую в WordPress:

/**
 * navigation.js
 *
 * Handles toggling the navigation menu for small screens.
 * Also adds a focus class to parent li's for accessibility.
 * Finally adds a class required to reveal the search in the handheld footer bar.
 */
(function() {
  // Wait for DOM to be ready.
  document.addEventListener('DOMContentLoaded', function() {
    var container = document.getElementById('site-navigation');
    if (!container) {
      return;
    }

    var button = container.querySelector('button');
    if (!button) {
      return;
    }

    var menu = container.querySelector('ul');
    // Hide menu toggle button if menu is empty and return early.
    if (!menu) {
      button.style.display = 'none';
      return;
    }

    button.setAttribute('aria-expanded', 'false');
    menu.setAttribute('aria-expanded', 'false');
    menu.classList.add('nav-menu');

    button.addEventListener('click', function() {
      container.classList.toggle('toggled');
      var expanded = container.classList.contains('toggled') ? 'true' : 'false';
      button.setAttribute('aria-expanded', expanded);
      menu.setAttribute('aria-expanded', expanded);
    });

    // Add class to footer search when clicked.
    document.querySelectorAll('.storefront-handheld-footer-bar .search > a').forEach(function(anchor) {
      anchor.addEventListener('click', function(event) {
        anchor.parentElement.classList.toggle('active');
        event.preventDefault();
      });
    });

    // Add focus class to parents of sub-menu anchors.
    document.querySelectorAll('.site-header .menu-item > a, .site-header .page_item > a, .site-header-cart a').forEach(function(anchor) {
      var li = anchor.parentNode;
      anchor.addEventListener('focus', function() {
        li.classList.add('focus');
      });
      anchor.addEventListener('blur', function() {
        li.classList.remove('focus');
      });
    });

    // Add an identifying class to dropdowns when on a touch device
    // This is required to switch the dropdown hiding method from a negative `left` value to `display: none`.
    if (('ontouchstart' in window || navigator.maxTouchPoints) && window.innerWidth > 767) {
      document.querySelectorAll('.site-header ul ul, .site-header-cart .widget_shopping_cart').forEach(function(element) {
        element.classList.add('sub-menu--is-touch-device');
      });
    }
  });

})();

1 Ответ

0 голосов
/ 26 августа 2018

Попробуйте заменить код jQuery следующим образом:

jQuery(document).ready(function($) {
  $(document).mouseup(function(e) {
    var $menuContainer = $('.menu');
    var $menu = $menu.find('ul');
    var $container = $('.site-navigation');
    var $button = $container.find('button')
    if (!$menuContainer.is(e.target) && $menuContainer.has(e.target).length === 0) {
      if ($container.hasClass('toggled')) {
        $button.attr('aria-expanded', false);
        $menu.attr('aria-expanded', false);
      }
    }
  });
});

Для скрытия / отображения меню используется код vanilla-js из шаблона, но с синтаксисом jQuery.

...