formaction是或的html5属性,用于覆盖的action,实现同一表单多路径提交;它仅对当前按钮生效,必须配合type="submit"使用,而普通action作用于整个表单且被所有submit按钮共享。

formaction 是什么,它和普通 action 有什么区别?
formaction 是 <button></button> 或 <input type="submit"> 的属性,用来临时覆盖表单的 action 属性。它只对当前按钮生效,不影响其他提交按钮——这正是实现“暂存”和“发布”共存的关键。
普通 action 写在 <form></form> 标签上,所有 submit 按钮都默认走那个地址;而 formaction 允许你为每个按钮指定独立的提交目标,不需要 JS 就能分流请求。
注意:formaction 必须配合 type="submit" 才有效,type="button" 会完全忽略它。
怎么写两个按钮分别走暂存和发布的 URL?
直接在按钮上加 formaction 即可,不用改表单本身:
-
/api/draft和/api/publish是后端两个不同接口,接收相同字段但语义和权限逻辑不同 - 两个按钮都用
type="submit",否则formaction不触发 - 表单的
method(如POST)仍生效,无需重复写在按钮上 - 如果需要区分操作类型,后端可通过请求路径或额外 hidden 字段判断,不依赖 query 参数
常见踩坑:为什么点了按钮却还是跳转到 form 的 action?
最常遇到的三个原因:
- 按钮写成了
<button type="button"></button> —— 浏览器不把它当提交控件,formaction 完全无效
-
formaction 值是相对路径但没处理好上下文,比如写成 draft 而不是 /api/draft,导致实际请求发到了 https://site.com/current-page/draft
- 表单里混用了
onsubmit JavaScript 并 return false 或 e.preventDefault(),结果整个提交被阻断,formaction 失效
<button type="button"></button> —— 浏览器不把它当提交控件,formaction 完全无效formaction 值是相对路径但没处理好上下文,比如写成 draft 而不是 /api/draft,导致实际请求发到了 https://site.com/current-page/draft
onsubmit JavaScript 并 return false 或 e.preventDefault(),结果整个提交被阻断,formaction 失效调试建议:打开浏览器开发者工具 → Network 标签页 → 点击按钮,看发出的请求 URL 是否是你写的 formaction 值。如果不是,优先检查 type 和路径写法。
要不要加 formmethod 或 enctype?
一般不需要,但特殊场景要显式控制:
- 如果暂存接口要求
GET(比如只传 ID),可以单独加 formmethod="GET",它会覆盖表单的 method
- 如果发布时需上传文件,对应按钮得加
enctype="multipart/form-data",否则文件字段为空
-
formmethod 和 enctype 都只作用于当前按钮,不影响另一个
GET(比如只传 ID),可以单独加 formmethod="GET",它会覆盖表单的 method
enctype="multipart/form-data",否则文件字段为空formmethod 和 enctype 都只作用于当前按钮,不影响另一个注意:enctype 只对 <input type="submit"> 生效,<button></button> 在部分旧版 Safari 中可能不支持,稳妥起见关键操作建议用 <input>。
enctype 和按钮级 enctype 同时存在时,以按钮的为准,但前提是浏览器支持 —— 这点容易被忽略,尤其在移动端 WebView 中。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











