formtarget属性是解决单表单多目标提交的关键手段,优先级高于form的target,仅对type="submit"或type="image"的button/input生效,支持_blank、_self、命名iframe等值。

formtarget 属性不是“锦上添花”,而是解决多目标提交场景下 target 全局覆盖失效的关键手段。它允许你在单个提交按钮上覆盖整个 的 target 行为,无需 JS、无需拆分表单。
什么时候必须用 formtarget 而不是
当你需要同一个表单具备多种响应打开方式时, 的 target 属性就力不从心了——它只能设一个值,全局生效。比如:
- 用户填写完资料后,“保存草稿”要静默提交(
_self),不跳转; - 同时提供“预览”按钮,需在新标签页打开渲染结果(
_blank); - 还有一个“导出 PDF”按钮,要定向到内嵌的
中加载(pdf-viewer)。
这些需求无法靠一个 满足,也别想着用 JS 改 form.target 再 submit——那会破坏原生表单的语义与可访问性。此时,formtarget 是唯一符合标准、零 JS、无障碍友好的解法。
formtarget 只能用在哪些元素上?
它只对两类提交触发器有效:
-
或—— 注意:不是所有input类型都支持,type="button"或type="text"加了也无效; -
—— 这是更推荐的写法,语义清晰、样式可控、默认行为稳定。
常见错误包括:
- 给
加formtarget,完全无效果; - 漏写
type="submit",浏览器按默认type="submit"处理,但部分旧版 Safari 会降级为type="button",导致formtarget失效; - 在
上使用,不合法也不起作用。
_parent 和 _top 在现代页面中怎么用?
HTML5 已废弃 ,所以这两个值不再用于传统框架集,但它们对 仍有明确语义:
-
_parent:把响应载入当前的父级上下文。如果表单在嵌套三层 iframe 里,且你希望响应出现在第二层(即当前 iframe 的直接父容器),就用它; -
_top:强制打破所有 iframe 嵌套,在最外层顶级窗口中打开响应。适合“退出嵌入态”场景,比如管理后台嵌入的子应用想全屏跳转回主站; - 注意:
_top在跨域 iframe 中可能被浏览器拦截(取决于X-Frame-Options或Content-Security-Policy设置),不是 100% 可靠; - 命名 iframe(如
formtarget="my-frame")要求对应存在,且同源(或服务端配置了正确的allow权限)。
兼容性和容易忽略的细节
IE9 及更早版本完全不支持 formtarget,哪怕加了也当不存在。如果你仍需支持 IE9,得回退到 JS 方案(例如监听 click、临时改 form.target、再调 form.submit())。但要注意:
- 这种 JS 提交会绕过原生的
submit事件和内置校验(required、pattern等); -
formtarget的优先级高于,但低于 JavaScript 动态设置的form.target(后者会在提交瞬间生效,覆盖前者); - 所有主流现代浏览器(Chrome ≥10、Firefox ≥4、Safari ≥5.1、Edge ≥12)均完整支持,包括移动端;
- 别混淆
formtarget和target:前者是提交按钮属性,后者是或的属性,作用对象和生效时机完全不同。
最常被漏掉的一点:当你用 formtarget="_blank" 时,浏览器新开的标签页默认没有 rel="noopener",存在轻微安全风险(新开页可通过 window.opener 访问原页)。虽然 formtarget 本身不提供 rel 控制,但若你用的是 ,可考虑配合 onclick + window.open 回退方案来补全——不过这就脱离了纯 HTML 语义了。权衡点就在这里:原生简洁性 vs 细粒度安全控制。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











