标签的target属性没有隐式默认值,不写即无作用;仅当显式设置如target="_blank"时才影响未声明target的a和form元素,且不自动添加rel="noopener"。

base target 属性的默认值到底是什么
<base> 标签的 target 属性**没有隐式默认值**——它只在你显式写出来时才生效。不写 target,就等于没设置任何默认跳转行为,所有链接按原生规则处理:<a href="..."></a> 用 _self,<form></form> 提交也走 _self。
常见误解是“不写 target 就等于 target="_self"”,但这是错的:<base target> 本身不参与层叠计算,它要么存在并兜底,要么不存在就不起作用。浏览器不会给你“补一个 _self”。
如果你写了 <base href="/"> 但没写 target,那它对跳转行为零影响;只有加上 target="_blank" 或 target="_top" 这类值,才会开始干预未声明 target 的元素。
为什么加了 <base target="_blank"> 后有些链接仍不新窗口打开
根本原因不是浏览器不支持,而是 <base target> 的作用范围被严格限定:
- 只影响未显式声明
target的<a></a>和<form></form>元素 - 对绝对 URL(如
https://example.com、//cdn.com)部分浏览器会忽略<base target>,尤其 Firefox 和 Safari - JavaScript 导航(
location.href、window.open())完全不受影响 -
<router-link></router-link>(Vue)、<link>(React)等框架封装组件也不走<base>规则
所以看到“外链没弹新页”,大概率是它们用了协议完整地址,或者被 JS 拦截了原始点击行为。
target="_blank" 搭配 <base> 必须手动加 rel="noopener"
<base target="_blank"> 不会自动给每个 <a></a> 注入 rel="noopener",这是关键安全盲区:
- 新标签页可通过
window.opener访问并控制原页面,构成 Tabnabbing 风险 - 即使你只在
写了一行<base target="_blank">,所有被它兜底的链接都暴露风险 - 现代 Lighthouse 和 Chrome DevTools 会直接标红警告:缺少
rel="noopener"
正确做法只有两个:
– 改用脚本批量补全:document.querySelectorAll('a:not([target])').forEach(a => { a.target = '_blank'; a.rel = 'noopener'; });
– 或者干脆别用 <base target>,对外链统一手写 target="_blank" rel="noopener noreferrer"
target="_parent" 和 target="_top" 在 iframe 场景下的静默降级
这两个值只在嵌套 <iframe></iframe> 时有意义,但行为容易被误判:
-
target="_parent":当前页面不在 iframe 中时,**不报错也不警告,直接等效于_self** -
target="_top":若主站被嵌入第三方平台(如 CMS 预览框),可能因 CSP 或sandbox策略被浏览器拒绝执行,最终 fallback 到_self - 写成
target="parent"(缺下划线)会被当作文本窗口名,找不到就新建窗口,且无rel="noopener"保护,更危险
真正需要 _top 的场景极少,比如 SSO 登录后强制跳出 iframe;但上线前必须在真实嵌入环境里验证是否真能跳出,不能只靠本地测试。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











