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

为什么JavaScript实现的多级导航子菜单点击功能运行异常

多级导航功能失效原因分析
  • 未阻止事件冒泡
    你给所有包含子菜单的li(.has-submenu)都绑定了点击事件,但点击子级菜单时,事件会向上冒泡到所有祖先级的.has-submenu元素,依次触发它们的点击回调。你只调用了e.preventDefault()阻止了链接跳转,没有调用e.stopPropagation()阻止冒泡,导致单次点击触发多层菜单的切换逻辑。
  • 子菜单选择逻辑错误
    你在回调中使用e.target.parentElement.querySelector("ul")查找要切换的子菜单,但事件冒泡触发父级回调时,e.target仍然是你最初点击的最下层元素,此时查找的ul并非当前绑定事件的父级li的子菜单,逻辑完全错位。正确的做法是使用绑定事件的当前元素来查找自身的子ul。
修复后的JS代码
let menus = document.querySelectorAll(".main-navigation ul li a");
menus.forEach((item) => {
  if (item.parentElement.querySelector("ul")) {
    item.parentElement.classList.add("has-submenu");
  }
});

let submenu = document.querySelectorAll(".has-submenu");
submenu.forEach((item) => {
  item.addEventListener("click", (e) => {
    e.preventDefault();
    // 阻止事件冒泡到上层菜单
    e.stopPropagation();
    // 从当前绑定事件的li元素下查找子ul
    let ul = item.querySelector("ul");
    let cs = window.getComputedStyle(ul).display;
    if (cs === "none") {
      ul.style.cssText = "display:block";
    } else {
      ul.style.cssText = "display:none";
    }
  });
});

内容的提问来源于stack exchange,提问作者Ren Jitsm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:54:05