base 标签的 target 属性为当前页面所有未显式声明 target 的 和 <form> 元素提供默认目标,仅影响无 target 属性的元素,不自动添加 rel="noopener",存在安全与行为干扰风险。
<base> 的 target 属性不是“给某个链接设打开方式”,而是为**当前页面所有未显式声明 target 的 <a> 和 <form> 元素**提供默认目标。它只影响那些没写 target 的标签,一旦你在某个 <a href="..." target="_blank"> 里写了,就完全绕过 <base>。
这是预期行为,但容易误用:
<a href="about.html">)、绝对路径链接(如 <a href="/contact">),甚至部分协议完整链接(除非你显式覆盖)<form> 提交也会走这个默认 target,可能造成表单提交后跳转到新标签页,打断用户流程<iframe>,且用了 target="myframe" 这类命名目标,<base target> 会干扰其行为——除非你同时配了 href 并确保命名一致<base target="_blank"> 不自动补 rel="noopener",这意味着从新标签页能通过 window.opener 反向控制原页面,存在安全风险真要用,得配合显式防护和边界控制:
<base> 放在 <head> 最前面,且整个文档只能有一个<base target>,改用 JS 批量加属性或 CSS-in-JS 注入逻辑target="_blank",务必在每个实际 <a> 上补 rel="noopener noreferrer" ——<base> 不帮你加这个href="#section")、空链接(href="#")、JavaScript 链接(href="javascript:void(0)")是否被意外带上新窗口行为多数真实项目里,<base target> 是个“省事但埋雷”的选择:
立即学习“前端免费学习笔记(深入)”;
document.querySelectorAll('a[data-blank]'))更灵活,还能按需加 rel
target
<base> 的 target 在 Web Components 或 Shadow DOM 中作用范围有限,容易失效真正难处理的不是怎么设,而是设完之后谁会受影响、谁会被漏掉、谁会因此变慢或不安全——这些细节往往在上线后才暴露。