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

使用HTML+CSS+JS实现下拉菜单时报Uncaught TypeError错误如何解决

问题排查与修复方案

错误原因

  • 核心报错原因:document.querySelectorAll('.sidebar-ul')返回的是包含所有下拉菜单的NodeList集合,并非单个DOM元素,集合本身没有classList属性,直接调用classList.add会抛出类型错误。
  • 逻辑问题1:没有关联点击按钮和对应的下拉菜单,原有写法试图操作所有下拉菜单,不符合单按钮控制对应菜单的需求。
  • 逻辑问题2:e.target在点击事件触发时必然存在,原有if(clicked)判断完全失效,无法实现菜单展开/收起的切换效果。

修复代码

替换你的JavaScript代码为以下内容即可解决报错,同时实现点击按钮切换对应下拉菜单展开/收起的效果:

const sidebarBtn = document.querySelectorAll('.sidebar-btn');

sidebarBtn.forEach((btn) =>
  btn.addEventListener('click', function (e) {
    // 阻止a标签默认跳转顶部的行为
    e.preventDefault();
    // 获取当前点击按钮后紧跟的对应下拉菜单
    const targetUl = btn.nextElementSibling;
    // 切换show类实现展开收起
    targetUl.classList.toggle('show');
  })
);

可选优化(互斥展开效果)

如果需要实现点击当前菜单时自动关闭其他已经展开的菜单,可以使用以下代码:

const sidebarBtn = document.querySelectorAll('.sidebar-btn');
const allSidebarUl = document.querySelectorAll('.sidebar-ul');

sidebarBtn.forEach((btn) =>
  btn.addEventListener('click', function (e) {
    e.preventDefault();
    const targetUl = btn.nextElementSibling;
    // 收起所有非当前点击的菜单
    allSidebarUl.forEach(ul => {
      if (ul !== targetUl) ul.classList.remove('show');
    })
    // 切换当前菜单状态
    targetUl.classList.toggle('show');
  })
);

额外CSS写法提示

你现有CSS代码中border-left: 1 px solid var(--primary-color);存在语法错误,数值和单位之间不能有空格,修改为border-left: 1px solid var(--primary-color);即可正常渲染左边框。

内容的提问来源于stack exchange,提问作者Nikola Maricic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:24:03