必须添加 rel="noopener noreferrer" 以防止新页面通过 window.opener 访问原页面并避免 referer 泄露,同时移动端 safari 对 target="_blank" 有严格限制。

用 target="_blank" 打开新标签页,但别漏掉 rel="noopener"
直接在 a 标签里加 target="_blank" 就能新开标签页,这是最常用也最直白的做法。但很多人忽略安全风险:新开页可通过 window.opener 访问原页面的 window 对象,可能被恶意利用做钓鱼或跳转劫持。
所以必须同步加上 rel="noopener"(推荐再加 noreferrer):
<a href="https://example.com" target="_blank" rel="noopener noreferrer">去示例站</a>
-
rel="noopener"切断新页对原页window.opener的访问权限 -
rel="noreferrer"还会阻止Referer头发送,进一步降低信息泄露风险 - 不加
rel="noopener"时,Chrome/Firefox 已在控制台警告;Safari 某些版本会静默降级为_self
target="_self" 是默认行为,显式写出来反而容易出错
如果你只是想在当前标签页跳转,完全不用写 target 属性——浏览器默认就是 _self。强行写上不仅冗余,还可能因拼写错误(比如写成 _slf 或 self 缺少下划线)导致意外在新窗口打开,或被某些旧浏览器忽略而降级为 _blank。
以下写法等价,但推荐第一种:
<a href="about.html">关于页</a>
<a href="about.html" target="_self">关于页</a>
- 省略
target更简洁、更可靠 - 如果项目有统一 lint 规则强制要求显式声明,那请确保值是完整且小写的
"_self" -
target="main"这类命名窗口已基本废弃,现代浏览器不支持,不要用
用 target 切换 iframe 标签页?别混淆概念
target 属性不能“切换”已存在的标签页(比如把百度页切到前台),它只控制「新发起的跳转」在哪打开。所谓“切换指定标签页”,常见误解是想复用某个已打开的 tab,但 HTML 原生不提供这种能力——target 的名字是历史遗留,不是“tab 切换器”。
如果你需要类似效果(比如点击多次都复用同一个窗口),只能靠 JavaScript 配合 window.open(),且需满足同源限制:
const win = window.open('dashboard.html', 'dashboard-tab');
- 第二个参数是窗口名(如
'dashboard-tab'),同名调用会复用已有窗口 - 但跨域页面无法被复用,且用户手动关闭后无法自动重建
- 纯 HTML 的
a标签做不到这个逻辑,硬套target="dashboard-tab"在多数浏览器中会被忽略或当作新窗口处理
移动端 Safari 对 target="_blank" 的特殊限制
iOS Safari 默认禁用 target="_blank" 的新窗口行为,尤其在微信内置浏览器、QQ 浏览器等 WebView 中更严格——点链接后可能直接在当前页跳转,或弹出提示框询问是否打开。
- 没有通用绕过方案;依赖 JS 的
window.open()也会被拦截(除非是用户手势触发) - 若业务强依赖多页并存,建议改用单页应用(SPA)+ 路由切换,或用
iframe做局部加载 - 测试时务必真机验证,模拟器和桌面 Safari 表现不具代表性
rel="noopener" 的缺失和移动端的兼容性落差——这两点不写进代码,上线后要么埋下安全漏洞,要么在 iPhone 上突然失效。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











