javascript:伪协议在ie9及更早版本中会触发onbeforeunload事件,因其将javascript:url解析后执行并尝试替换当前文档,而onbeforeunload恰在此前调用;正确写法仅限javascript:void(0)或javascript:;,避免返回值覆盖页面,现代项目应改用href="#"加event.preventdefault()或语义化替代。

javascript:伪协议会触发 onbeforeunload(尤其在 IE)
点击 href="javascript:;" 或 href="javascript:void(0);" 的 @#@#@#@#@#@#@#@#@#@0,download 会被浏览器直接忽略——连警告都不会报。
- 正确做法:用
URL.createObjectURL(new Blob([...]))生成 blob URL,再设为href,此时download才起作用 - 伪协议里想触发下载?只能靠
location.href = "data:text/csv,..."或fetch().then(res => res.blob()).then(blob => ...) - 注意:
mailto:、tel:、javascript:这三类伪协议,download全都不认
伪协议返回值会覆盖当前页面(极小概率但真实存在)
绝大多数人写 javascript:void(0) 是为了返回 undefined,防止页面被替换。但如果手误写成 javascript:alert(1) 或 javascript:123,浏览器会把弹窗返回值或数字字面量当新页面内容渲染——整个当前页变成纯文本 123 或空白(因 alert() 返回 undefined,但执行过程可能干扰渲染)。
- 安全写法只有两种:
javascript:void(0)或javascript:;(分号结尾,明确无返回) - 绝对不要写
javascript:func(),哪怕 func 返回 undefined —— 因为执行过程本身可能抛错或触发副作用 - 现代项目建议统一用
href="#"+onclick中调用event.preventDefault(),语义清晰且无歧义
搜索引擎与可访问性直接降级
搜索引擎爬虫几乎不执行 JavaScript,href="javascript:..." 的链接会被当作无效链接处理,既不计入外链权重,也不参与页面结构分析。屏幕阅读器也会跳过这类链接,或读作“未定义链接”,对视障用户完全不可用。
- 替代方案:用
<button type="button"></button>代替纯交互型<a></a>,语义正确、无需 hack - 如果必须保留
<a></a>外观(比如导航菜单),至少设role="button"和tabindex="0",并在onclick中补全键盘支持(Enter/Space 触发) - SEO 敏感场景(如首页入口、核心功能跳转),伪协议链接应视为技术债,优先重构为真实路由或渐进增强式交互
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











