href="javascript:void(0)"本质是利用javascript:伪协议执行void(0)返回undefined,使浏览器无url可跳转,从而“看似”阻止跳转;它主要用于保留标签的原生交互特性(如tab聚焦、hover样式、可访问性),但存在seo劣化、csp拦截、屏幕阅读器不友好等问题;现代推荐改用或加role="button"+event.preventdefault()。

href="javascript:void(0)" 是为了阻止跳转,但别当真
它本质是用 javascript: 伪协议触发 JS 执行,再靠 void(0) 返回 undefined,让浏览器没地址可跳——于是“看起来”没跳转。但这不是防跳转的正经手段,只是历史惯性下的权宜之计。
为什么用它?主要是为了保留 a 标签的默认行为特征
加了 href 属性,<a></a> 才能:
– 被键盘 Tab 键聚焦(可访问性基础)
– 在未加载 CSS 时仍显示手型光标(cursor: pointer)
– 被 :link 或 :hover 选择器命中(样式可控)
– 在低版本 IE 中正常响应鼠标事件
这些都不是靠 JS 实现的,而是 HTML 原生语义赋予的。
它带来的实际问题比你想象的多
href="javascript:void(0)" 看似干净,但:
– 搜索引擎视其为死链,不传递权重,大量使用会降低页面可信度评分
– 屏幕阅读器无法理解这个链接“要干什么”,必须配 aria-label 或 title 才算勉强可用
– javascript: 在 CSP 严格策略下可能被直接拦截(报 Refused to execute script 错误)
– 部分老 IE 对末尾缺分号的写法(如 javascript:void(0))有 GIF 动画暂停 bug
真正该怎么做:去掉 href,改用 button 语义或 role
现代方案不是修修补补,而是换思路:
– 如果功能就是“点一下执行 JS”,就用 <button type="button"></button>,天然可聚焦、可键盘操作、无障碍友好
– 如果必须用 <a></a>(比如要保持 inline 布局),那就删掉 href,加上 role="button" 和 tabindex="0",再绑定 click 事件并调用 event.preventDefault()
– 所有交互元素都必须带 aria-label 或可见文本,否则对辅助技术就是黑盒
– 别再依赖 javascript:void(0) 当“万能占位符”,它只是没出事,不代表做对了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











