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

javascript:伪协议会触发 onbeforeunload(尤其在 IE)
点击 href="javascript:;" 或 href="javascript:void(0);" 的 <a> 标签,在 IE9 及更早版本中,会**先触发 window.onbeforeunload**,再执行 onclick。如果你的页面恰好注册了该事件并做了副作用操作(比如清空表单、重置筛选项),就会意外触发。
这不是 bug,而是 IE 对 javascript: URL 的标准处理流程:解析 → 执行 → 返回值 → 替换当前文档(即使返回 undefined)。而 onbeforeunload 正是在“替换文档”前被调用。
- 排查方式:在控制台临时注释掉
window.onbeforeunload = ...,再点链接看是否还出问题 - 修复思路:把清理逻辑从
onbeforeunload移到更可控的位置(如提交前校验、路由离开守卫等) - 兼容底线:若必须支持 IE9,建议彻底弃用 javascript: 伪协议,改用
href="#"+event.preventDefault()
download 属性对 javascript: 伪协议完全无效
download 是为真实资源下载设计的,只对同源的 http://、https://、blob:、data: 链接生效。写成 <a href="javascript:doExport()" download="data.csv">导出</a>,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,但执行过程可能干扰渲染)。
立即学习“Java免费学习笔记(深入)”;
- 安全写法只有两种:
javascript:void(0)或javascript:;(分号结尾,明确无返回) - 绝对不要写
javascript:func(),哪怕 func 返回 undefined —— 因为执行过程本身可能抛错或触发副作用 - 现代项目建议统一用
href="#"+onclick中调用event.preventDefault(),语义清晰且无歧义
搜索引擎与可访问性直接降级
搜索引擎爬虫几乎不执行 JavaScript,href="javascript:..." 的链接会被当作无效链接处理,既不计入外链权重,也不参与页面结构分析。屏幕阅读器也会跳过这类链接,或读作“未定义链接”,对视障用户完全不可用。
- 替代方案:用
<button type="button">代替纯交互型<a>,语义正确、无需 hack - 如果必须保留
<a>外观(比如导航菜单),至少设role="button"和tabindex="0",并在onclick中补全键盘支持(Enter/Space 触发) - SEO 敏感场景(如首页入口、核心功能跳转),伪协议链接应视为技术债,优先重构为真实路由或渐进增强式交互



















