target 属性必须写在 <form> 标签上,与 action、method 并列;写在按钮、JS 或 action 中均无效,且仅对表单原生提交的响应位置生效。

target 属性必须写在 <form> 标签上,不是按钮、不是 JS、也不是 action 里——它只对表单提交的响应位置起效。
target 写在哪?常见错位操作
很多人把 target 加到 <button type="submit"> 或 <input type="submit"> 上,或者试图用 location.href 模拟跳转,结果表单仍刷新当前页。这是无效的。
-
target是<form>的原生 HTML 属性,和action、method并列 - 加在子元素(如按钮)上会被浏览器忽略,除非你用的是
formtarget - JS 中设置
form.target = "_blank"是合法的,但前提是操作对象是<form>元素本身
target="_blank" 为什么有时没反应?
现代浏览器普遍拦截无用户手势触发的 _blank 窗口,而表单提交属于“有交互”,本应放行。但若页面启用了 strict CSP(如 popup-src 'none'),或使用了某些前端框架的路由劫持(如 Vue Router 的 router-link 套着表单),就可能失效。
- 检查控制台是否报
Failed to open window类错误 - 确认没有在
<form>外层包裹preventDefault()的 submit 监听器 - 若仍被拦截,可用隐藏
<iframe name="myframe">+target="myframe"替代,更稳定
formtarget 覆盖 target 的实际用途
当一个表单有多个提交按钮,且希望各自导向不同上下文时,formtarget 就派上用场了。它只作用于 type="submit" 的 <button> 或 <input>,优先级高于 <form> 的 target。
立即学习“前端免费学习笔记(深入)”;
- 例如:主按钮用
formtarget="_self"刷新当前页,预览按钮用formtarget="_blank"查看渲染效果 -
formtarget是 HTML5 新增属性,IE10+ 和所有现代浏览器均支持 - 注意:它不适用于
type="button",也不影响fetch或axios这类 JS 提交
SPA 场景下 target 几乎无用
在 React/Vue/Angular 等单页应用中,表单默认行为(整页提交 + 页面跳转)通常被显式阻止,改用 fetch 或 axios 异步提交。此时 target 属性完全不生效。
- 如果你发现写了
target="_blank"却没新窗口,先查是否绑了event.preventDefault() - 需要类似效果,得手动
window.open(url, '_blank'),再在成功回调里填充内容 - 服务端返回 HTML 片段时,
target仍可工作,但前提是没走 JS 拦截流程
真正容易被忽略的点是:HTML5 虽然恢复了 target 支持,但它已不再为 <frameset> 设计;_parent 和 _top 现在基本只在嵌套 <iframe> 场景下有意义,普通页面里它们和 _self 行为几乎一致。



















