正确写法是,需同时设置target和rel属性,后端必须返回完整html页面,且rel必须写在form标签上。

<form target="_blank"></form> 能让表单提交后,响应内容在新标签页(或窗口)中打开,而不是刷新当前页面。但直接写 target="_blank" 远不够——它容易失效、不安全、甚至被浏览器静默降级为当前页跳转。
关键不是“能不能写”,而是“怎么写才真正生效且安全”。
必须同时加 rel="noopener noreferrer"
只写 target="_blank" 是不完整的,现代浏览器(Chrome 88+、Firefox 79+、Edge 90+)会主动拦截并降级为 _self,尤其在跨域或 iframe 场景下。
正确写法是:
注意:
-
rel属性必须写在<form></form>标签上(不是<button></button>或<input>) -
rel="noopener noreferrer"缺一不可:-
noopener防止新页通过window.opener控制原页面(避免 Tabnabbing 攻击) -
noreferrer阻止 Referer 头泄露来源地址,保护用户隐私
-
后端响应必须是可渲染的 HTML 页面
target="_blank" 的本质是导航行为:浏览器把响应内容当作新页面加载。如果后端返回:
- 纯 JSON(如
{ "status": "ok" })→ 新页显示乱码或空白 - 空响应或 302 重定向 → 可能跳转失败或白屏
-
Content-Type不是text/html→ 浏览器拒绝渲染
✅ 正确做法:后端返回完整 HTML(含 ...),例如成功提示页或预览页。
验证方法:把表单的 action 地址手动粘贴进新标签页访问,看是否能正常显示。
注意表单嵌套在 iframe 中的特殊情况
如果 <form></form> 在 <iframe></iframe> 里:
-
target="_blank"仍有效,但可能触发弹窗拦截(尤其父页启用了sandbox或 CSP 的popup-src限制) -
target="_parent"或target="_top"更容易出问题:前者可能覆盖父文档导致白屏,后者可能中断 SPA 路由
推荐方案:
- 显式命名目标窗口,如
target="report-view",再配合<iframe name="report-view" style="display:none"></iframe>实现无刷新提交 - 或改用
fetch()+event.preventDefault()完全绕过target机制,更可控
formtarget 比 target 更灵活(按按钮定制)
同一表单多个提交动作,可用 formtarget 分别控制:
注意:
-
formtarget只对<button type="submit"></button>和<input type="image">生效 - 它优先级高于
<form></form>的target,适合精细化跳转控制 -
rel属性不能写在<button></button>上,必须仍放在<form></form>标签里(否则无效)
不复杂但容易忽略
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











