在现代浏览器中基本无效,仅理论上影响、和,实测中无显式target的链接仍当前页打开,js跳转完全无视;易被显式target、form target、位置错误或重复声明覆盖;安全起见应主动为外链添加target="_blank"和rel="noopener noreferrer"。

为什么<base target>写了却没反应
不是你写错了,是它本来就不该“生效”——现代浏览器(Chrome/Firefox/Safari)对 <base target> 的支持已基本退化为纸面规范。W3C 说它只影响 <a></a>、<area> 和 <form></form>,但实测中:点击没写 target 的 <a href="xxx"></a>,依然在当前页打开;window.location.href = "xxx" 或路由跳转更完全无视它。这不是 bug,是事实。
<base target>被覆盖的常见情况
即使某旧版内核偶然认它,也极易被更高优先级规则干掉:
-
<a href="..."></a>自己带target属性(哪怕值是空字符串target="",也算显式声明,<base>失效) - 页面里有
<form target="_top"></form>,它的target永远优先生效 -
<base>没放在里,或出现了两次(第二个被忽略) - 链接是 JS 触发的:
document.getElementById("btn").onclick = () => location.href = "/home"——<base target>对这种跳转零影响
真正能落地的替代方案
别赌 <base target>,用明确、可控的方式补救:
- 对外链批量加
target="_blank" rel="noopener noreferrer":document.querySelectorAll('a[href^="http"]:not([target])').forEach(a => { a.target = '_blank'; a.rel = 'noopener noreferrer'; }); - 拦截点击并主动
window.open()(兼容性最强):document.addEventListener('click', e => { const a = e.target.closest('a[href]:not([target])'); if (a && !a.href.startsWith('#') && !a.href.startsWith('mailto:') && !a.href.startsWith('tel:')) { e.preventDefault(); window.open(a.href, '_blank', 'noopener'); } }); - 在框架(如 Vue/React)中,统一封装 Link 组件,内部强制处理
target和rel,不依赖全局<base>
最容易被忽略的细节
<base target> 不会自动加 rel="noopener",而 target="_blank" 缺少这个属性时,新页面可通过 window.opener 控制原页面,存在安全风险。更隐蔽的是:它对所有未设 target 的 <a></a> 一视同仁,包括页脚备案链接、第三方 SDK 的跳转按钮、甚至 CMS 插入的编辑链接——你根本没意识到它们也被卷进去了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











