You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jQuery实现导航li点击 为对应子菜单ul li添加/移除类名

WordPress自定义导航移动端子菜单点击交互实现

问题背景

在做WordPress自定义导航菜单适配时,桌面端通过鼠标悬停主菜单项唤起子菜单的交互,在移动端触屏场景下无法生效,需要实现点击主菜单项展开对应子菜单的效果。

现有菜单结构

<ul class="navigation__list">
 <li class="navigation__link"><a>Main Menu Item</a>
  <ul class="navigation_item--submenu">
   <li class="navigation__link"><a>Sub Menu Item</a>
   <li class="navigation__link"><a>Sub Menu Item</a>
   <li class="navigation__link"><a>Sub Menu Item</a>
   <li class="navigation__link"><a>Sub Menu Item</a>
  </ul>
 </li>
</ul>

注意:现有HTML结构存在标签未闭合问题,正式使用前需要补全所有<li>标签的闭合标签,避免DOM结构异常影响交互。

原有代码问题分析

你之前写的jQuery代码无法正常运行,核心原因有3个:

  • 选择器全局匹配所有子菜单下的li元素,没有和当前点击的主菜单项做关联,会出现点一个菜单所有子菜单同时切换的问题
  • 类名挂载目标错误,控制显隐的show-menu类应该加在子菜单容器<ul class="navigation_item--submenu">上,而不是子菜单内部的li元素上
  • 没有做事件冒泡阻止,点击子菜单项时会同时触发父级li的点击事件,导致子菜单刚展开就被收起

可直接复用的实现方案

第一步:补充CSS显隐样式

/* 移动端默认隐藏子菜单,桌面端hover样式可保留原有逻辑 */
.navigation_item--submenu {
  display: none;
}
.navigation_item--submenu.show-menu {
  display: block;
}

第二步:替换原有jQuery逻辑

jQuery(document).ready(function($){
  // 只给带子菜单的主菜单项绑定点击事件,减少无效监听
  $('.navigation__list li:has(.navigation_item--submenu)').on('click', function(e){
    // 阻止事件向上冒泡,避免点击子菜单时触发父级的点击逻辑
    e.stopPropagation();
    // 找到当前点击项对应的直属子菜单
    const activeSubmenu = $(this).children('.navigation_item--submenu');
    // 切换当前子菜单的显隐状态
    activeSubmenu.toggleClass('show-menu');
    // 关闭其他已展开的子菜单,避免同时展开多个下拉
    $('.navigation_item--submenu').not(activeSubmenu).removeClass('show-menu');
  });

  // 点击页面空白区域时,自动收起所有展开的子菜单
  $(document).on('click', function(){
    $('.navigation_item--submenu').removeClass('show-menu');
  });
});

效果说明

  • 点击带下拉的主菜单项,即可展开/折叠对应子菜单
  • 同一时间只会展开一个子菜单,交互逻辑更符合移动端使用习惯
  • 点击子菜单项、页面空白区域都不会出现交互异常
  • 原有桌面端hover逻辑不受影响,可正常使用

内容的提问来源于stack exchange,提问作者Dee F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:27:20