href="#"会跳转页首,href="javascript:void(0)"不会滚动;前者因#是默认锚点#top触发跳转并修改url,后者为死链接但存在语义、可访问性及现代框架兼容性问题。

href="#" 会触发页面滚动到顶部,href="javascript:void(0)" 不会——这是最直接、最常踩的坑。
点击 href="#" 为什么会跳到页首?
因为 # 是合法的 URL 片段标识符,浏览器把它当作一个锚点链接处理。当页面中没有匹配的 id 或 name 时,它默认锚定到文档开头(即 #top)。这不仅造成视觉跳动,还会在地址栏末尾追加 #,影响前端路由或历史记录判断。
- 即使你绑了
onclick事件,href="#"的默认行为仍会在事件执行后生效,除非显式调用event.preventDefault() - 在单页应用(如 React/Vue)里,这个跳转会干扰路由监听,甚至导致
popstate误触发 - 部分屏幕阅读器会把
#解读为“跳转到无效锚点”,影响无障碍体验
href="javascript:void(0)" 真的“更安全”吗?
它确实不会滚动、不改 URL、不触发导航,但有隐性代价:
- 语义上不是超链接:它绕过了 HTML 的原生交互模型,对键盘用户(如按
Tab+Enter)的支持不可靠,某些浏览器或辅助工具可能忽略其可交互性 - SEO 和可访问性差:搜索引擎无法理解这个链接意图;
role="button"和tabindex="0"得手动补全 - 现代框架中已被视为反模式:React 官方示例从不推荐用
a标签配void(0),而是倾向用button元素 - 注意写法必须是
javascript:void(0),漏掉括号(如javascript:void 0)或空格会导致语法错误
真正该用什么替代空链接?
优先级从高到低:
- 用
<button type="button"></button>:语义正确、天然无跳转、键盘友好、无需额外 ARIA 属性 - 用
<a href="#" onclick="handler(); return false;"></a>:仅当必须保留链接样式且兼容老系统时才考虑,return false能同时阻止默认行为和事件冒泡 - 用
<a href="#" onclick="handler(); event.preventDefault();"></a>:比return false更可控,尤其在事件委托场景下 - 避免纯 JS 字符串协议:IE 已废弃
javascript:协议支持,Chrome 对其有警告,CSP 策略也可能拦截
最易被忽略的一点:空链接从来不该是第一选择。如果它不跳转、不导航、也不提交,那它大概率本就不该是 a 标签——按钮、带 role 的 div 或封装好的组件才是更干净的解法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











