会,base target="_blank"会让所有未显式设置target的form提交到新标签页,这是html规范定义的默认行为,不受action路径类型影响;但需注意其会意外劫持表单,建议显式为form设置target="_self"以隔离风险。

base target="_blank" 会让 form 提交跳新窗口吗
会,而且是默认行为——只要 <base target="_blank"> 存在,所有没显式写 target 的 <form></form> 都会提交到新标签页,不管 action 是相对路径、绝对路径,甚至空字符串。这不是 bug,是规范定义的行为。
常见错误现象:
-
<form action="/api/submit"></form>提交后页面空白,用户看不到响应,也回不到原表单 - 表单里用了
event.preventDefault()拦截,但页面仍跳转——因为浏览器在解析阶段已按<base>绑定了目标,JS 拦截不改变这个初始导航意图 - 第三方 UI 组件(如 Ant Design 的
<form></form>)内部用原生<form></form>标签,意外被全局 target 影响
为什么 form 会被 base target 控制,而 fetch 不会
因为 <base> 只干预 HTML 解析阶段的**静态属性绑定**:action 是 <form></form> 的硬编码属性,属于它管辖范围;而 fetch() 是运行时 JS 调用,完全走自己的 URL 解析逻辑(基于 window.location),和 <base> 无关。
关键区别:
- ✅ 受影响:
<form action="login.php"></form>、<a href="profile.html"></a>、<iframe src="embed.html"></iframe> - ❌ 不受影响:
fetch('/api/user')、axios.post('/login')、document.createElement('form').action = '...'
如何避免表单被 base target 意外劫持
最稳妥的方式是:别依赖 <base target> 控制表单,只让它管链接。如果真要统一新开链接,必须显式隔离表单行为。
- 给每个
<form></form>显式加target="_self"(哪怕你没打算跳转,也要写上) - 不要把
<base target="_blank">放在含表单的页面里——尤其登录页、支付页这类关键流程页 - 若必须用
target="_blank",务必给所有<a></a>补rel="noopener noreferrer";<base>不帮你加这个 - 检查第三方组件源码或文档,确认它们是否封装了
<form></form>并依赖默认 target
测试时最容易漏掉的边界情况
很多人只测了正常链接,却忘了这些:
-
<a href="#"></a>或<a href=""></a>—— 它们仍受<base target>影响,会新开一个空白页 -
<form action=""></form>—— 提交到当前页面 URL,但仍是新窗口打开 - 锚点链接
<a href="#section1"></a>—— 页面滚动失效,变成新开页并定位到 #section1 - JavaScript 链接
<a href="javascript:doSomething()"></a>—— 在部分旧浏览器中也会触发新窗口
真正麻烦的不是 <base> 本身,而是它让“没写 target”这件事有了隐式语义——而表单恰恰是最不能容忍隐式的交互元素。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











