在现代浏览器中基本不生效,仅对无显式target的、和window.open()起作用,但实际被主流浏览器忽略,且存在安全、seo、无障碍等多重风险,应改用显式target或javascript精准控制。

<base target="_blank"> 在现代浏览器中基本不生效,不是设置链接新窗口打开的可靠方式。
为什么<base target="_blank">经常没反应
它只对三类未显式声明 target 的元素起作用:<a></a>、<form></form> 和 window.open()(且未传第二个参数)。但实际中:
- Chrome/Firefox/Safari 已基本忽略它对
<a></a>的影响,哪怕链接是相对路径且没写target - 绝对 URL(如
https://example.com)、锚点(href="#top")、javascript:链接完全不受控 -
<form></form>提交后跳新页会打断流程,而你可能根本没意识到是<base>导致的 - 页面里只要有一个显式
target="_self",就覆盖掉整个<base>行为
真正生效的场景极少,且风险明确
即使在少数旧 WebView 或 IE11 中看似“生效”,也会带来问题:
- 不自动加
rel="noopener"→ 新页可通过window.opener控制原页,存在安全漏洞 - 不区分内外链:站内导航也开新页,破坏用户预期和 SEO 跳转逻辑
- Safari 在
<iframe></iframe>嵌套下可能静默忽略,导致行为不一致 - 无障碍支持缺失:屏幕阅读器无法获知链接会在新窗口打开,违反 WCAG
替代方案:用 JavaScript 精准控制更可靠
如果目标是「所有外链新窗口 + 安全隔离」,直接操作 DOM 更可控:
document.addEventListener('click', (e) => {
const a = e.target.closest('a[href]:not([target]):not([href^="mailto:"]):not([href^="tel:"]):not([href^="#"])');
if (a && a.href.startsWith('http') && !a.href.startsWith(window.location.origin)) {
e.preventDefault();
window.open(a.href, '_blank', 'noopener,noreferrer');
}
});
要点:
- 用
startsWith('http')判断外链,比href^="https://"更兼容 http/https 混合场景 - 排除
window.location.origin开头的地址,确保站内链接不误伤 -
window.open()第三个参数必须显式写'noopener,noreferrer',不能靠rel属性补 - 动态插入的链接(如 AJAX 加载内容)也能捕获,因用了事件委托
最常被忽略的是:<base target> 不是“设了就管用”的开关,而是个边界模糊、浏览器实现不一、调试困难的遗留特性。真要控制跳转行为,就别绕弯——显式写 target="_blank" rel="noopener noreferrer",或用 JS 按需判断,省去后期排查“为什么有时有效有时无效”的时间。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











