【问题标题】:jQuery: How can I get sub-menus to stay open when clicking sub-sub-menusjQuery:单击子子菜单时如何使子菜单保持打开状态
【发布时间】:2019-05-20 22:55:36
【问题描述】:

似乎已经有一些与此相关的主题,但他们的答案似乎都不适合我。

所以,我正在构建一个 Wordpress 主题,我希望它能够拥有子菜单和子子菜单等。 所以我最终得到了一个有点像这样的菜单结构:

<ul id="menu-main-navigation-menu" class="menu">
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item current_page_item"><a href="" aria-current="page">Home</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Products</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children"><a href="">Services</a>
    <ul class="sub-menu">
      <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Basic</a></li>
      <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Intermediate</a></li>
      <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children"><a href="">Advanced</a>
        <ul class="sub-menu">
          <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Advanced Service 1</a></li>
          <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Advanced Service 2</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

因此,具有子 ul 的 li 具有“menu-item-has-children”类,这是它们与任何其他 li 的唯一区别。

现在,在 jQuery 中我已经尝试过:

jQuery(document).on('click','.menu-item-has-children',function(){
  jQuery(this).toggleClass('active');
});

但是这样做的问题是,当我点击“.menu-item-has-children”中的“.menu-item-has-children”时,我实际上是同时点击了两者,所以子子菜单将类“.active”添加到其中并按应有的方式打开它,但它的父子菜单失去了它的“.active”类,因此两者都折叠了。

我的目标是,每次我点击子菜单时,如果它关闭则应该打开,或者如果它打开则应该关闭。每次我点击一个子菜单时,它应该相应地打开和关闭,但它的父子菜单应该保持打开状态。 这也应该适用于 sub-sub-sub-sub-menus 和 sub-sub-sub-sub-sub-menus 等......所以我真的需要一个通用的解决方案,无论子菜单嵌套多深都可以工作。

【问题讨论】:

    标签: javascript jquery wordpress


    【解决方案1】:

    查看event.stopPropagation() 的文档。在基本层面上,它可以防止当前事件通过父元素“冒泡”。这是一个基于您提供的 sn-ps 的超级基本示例。

    您还可以在单​​击处理程序中添加其他检查,例如确定项目是否具有类或子项 - 但在基本级别上,最简单的做法是停止通过父元素传播。

    jQuery(document).on('click', '.menu-item-has-children', function(e){
      e.stopPropagation();
      jQuery(this).toggleClass('active');  
    });
    .menu > li {
      display: block;
    }
    
    .sub-menu {
      display: none;
    }
    
    .active > .sub-menu {
      display: block;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <ul id="menu-main-navigation-menu" class="menu">
      <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item current_page_item"><a href="#" aria-current="page">Home</a></li>
      <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="#">Products</a></li>
      <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children"><a href="#">Services</a>
        <ul class="sub-menu">
          <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="#">Basic</a></li>
          <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="#">Intermediate</a></li>
          <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children"><a href="#">Advanced</a>
            <ul class="sub-menu">
              <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="#">Advanced Service 1</a></li>
              <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="#">Advanced Service 2</a></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>

    【讨论】:

    • 非常感谢 Xhynk。我已将其应用到我的代码中,并且运行良好。
    • 我确实看过 stopPropagation(),但我不确定如何在这里应用它。我还阅读了其他帖子,其中人们说 stopPropagation() 是一个不好的方法,因为它会破坏所有进程并且使用类似“if (!jQuery(event.target).closest()...”的东西更好。当然,我也不知道如何在这里应用它。但是,嘿,“stopPropagation()”有效,所以我不打算敲它。谢谢!:-)
    • 根据您具体需要做什么,您当然可以对 event.target 进行检查 - 但我认为,在这种情况下,您真的不需要这样做,因为您只关心当前最低级别的菜单项正在被主动点击!在某些情况下检查event.target 更好,而在其他情况下检查event.stopPropagation() 更好。如果您确实需要处理对更高级别项目的点击,那么停止冒泡会很糟糕 - 所以对于其他 HTML 结构请记住这一点,但对于像这样的菜单,现在应该就足够了!
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多