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

JavaScript菜单链接无法打开:已实现active类切换但href不生效

问题排查:菜单点击可添加active类但链接无法跳转

你开发的JavaScript菜单已经实现了点击时给当前元素添加active类、移除其他元素的该类,也正确设置了href属性,但点击时链接始终无法打开,相关代码如下:

JavaScript代码

const li = document.querySelectorAll('.list-item');
const arr = ['Home', 'About', 'Contact', 'Projects'];

li.forEach((elementul, index) => {
    elementul.setAttribute('href', arr[index].toLocaleLowerCase() + '.html');

    elementul.addEventListener('click', function (e) {
        e.preventDefault();

        li.forEach(liElement => {
            liElement.classList.remove('active');
        });

        elementul.classList.add('active');

        console.log(elementul.href);
    });
});

HTML代码

<li class='pagini' > 
 <a class='list-item' href='#' >${element} </a>            
</li>

问题根源

核心原因是你在点击事件处理函数里调用了e.preventDefault()——这个方法的作用就是阻止标签的默认跳转行为,所以哪怕href属性设置正确,点击也不会触发页面跳转。


解决方案

方案1:直接允许默认跳转(最常用)

如果只需要完成类切换后正常跳转,直接删除e.preventDefault();这一行即可。浏览器会先执行类切换的逻辑,再触发页面跳转,类的修改会正常生效。

修改后的事件代码:

elementul.addEventListener('click', function (e) {
    li.forEach(liElement => {
        liElement.classList.remove('active');
    });

    elementul.classList.add('active');

    console.log(elementul.href);
});

方案2:手动控制跳转(适合有异步操作的场景)

如果需要先执行异步操作(比如请求数据、动画效果),再跳转页面,可以保留e.preventDefault(),在逻辑完成后手动触发跳转:

elementul.addEventListener('click', function (e) {
    e.preventDefault();

    // 执行类切换逻辑
    li.forEach(liElement => {
        liElement.classList.remove('active');
    });
    elementul.classList.add('active');

    // 模拟异步操作(比如API请求)
    setTimeout(() => {
        // 手动跳转到目标地址
        window.location.href = elementul.href;
    }, 500);
});

内容的提问来源于stack exchange,提问作者Claudiu C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:46:16