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

点击仅含#的锚点链接触发语法错误的JS问题求助

问题解决:点击href="#"的链接时出现SyntaxError

问题原因

当链接的href值为单独的#时,document.querySelector('#')是无效的CSS选择器——CSS的ID选择器要求#后面必须跟一个合法的标识符(不能是空字符串),所以执行这行代码会抛出语法错误。

解决方案

在点击事件处理逻辑中,单独判断href是否为#:

  • 如果是#,直接执行回到顶部的滚动操作(这也是这类链接的常规行为)
  • 如果是#xxx格式的锚点,再尝试查找目标元素并滚动

同时可以优化链接筛选逻辑,直接用CSS属性选择器a[href^="#"]来获取所有以#开头的链接,无需额外的数组转换和过滤步骤。

修改后的代码

// 直接筛选所有href以#开头的链接
document.querySelectorAll('a[href^="#"]').forEach(el => {
    el.addEventListener('click', e => {
        e.preventDefault();
        const href = el.getAttribute('href');
        
        // 处理单独的#链接:回到顶部
        if (href === '#') {
            if ('scrollBehavior' in document.documentElement.style) {
                window.scrollTo({ top: 0, behavior: 'smooth' });
            } else {
                window.scrollTo(0, 0);
            }
            return;
        }
        
        // 处理带ID的锚点链接
        const toTarget = document.querySelector(href);
        if (toTarget) {
            if (toTarget.scrollIntoView) {
                toTarget.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest" });
            } else {
                const rect = toTarget.getBoundingClientRect();
                window.scrollTo(rect.x, rect.y);
            }
        }
    });
});

额外说明

  • 使用a[href^="#"]选择器比手动过滤更高效,也更符合DOM查询的最佳实践
  • 针对不支持平滑滚动的浏览器做了降级处理,保证兼容性
  • 单独处理#链接的逻辑,既避免了语法错误,也符合用户对这类链接的预期行为

内容的提问来源于stack exchange,提问作者Mathieu Préaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:03:14