Navbar导航栏点击没反应是怎么回事?
我用原生JS写了个简单的导航栏,点击菜单项应该切换active状态,但点完完全没变化,控制台也没报错,不知道哪里出问题了。
试过给每个li加事件监听,也检查了类名拼写,还是不行。代码如下:
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', () => {
navItems.forEach(i => i.classList.remove('active'));
item.classList.add('active');
});
});
.nav-item元素是不是动态生成的?比如用innerHTML、appendChild之类的,或者通过 AJAX 加载进来的。如果是的话,那问题就出在这儿——你写的querySelectorAll是在页面初始加载时执行的,那时候这些元素可能还不存在,所以navItems其实是个空的 NodeList,自然加不上监听器。最简单的验证方式:在那行
const navItems = ...后面加一句console.log(navItems),看控制台输出是不是NodeList(0),如果是,那就确认是这个问题。解决方案有两个:
一种是把 JS 放到
底部,紧挨着关闭标签前,确保 DOM 已经渲染完了再执行。另一种是用事件委托,比如给整个导航容器加监听,再判断点击的是不是
.nav-item,这样不管元素是不是后来加进来的都能生效。代码大概这样写:另外顺手检查下:
.nav-item这个类名有没有拼错?CSS 里.active的样式是不是写对了?有时候类名加了但没生效,其实是被其他样式覆盖了或者没写对选择器层级。如果这些都确认没问题,再贴一下你的 HTML 结构,我帮你再看看。