formaction是HTML5原生属性,仅对type="submit"的button或input生效,可覆盖表单action实现多路径提交;普通submit按钮则始终遵循form的action和method。

formaction 是什么,它和普通 submit 有啥区别?
formaction 是 <button> 或 <input type="submit"> 的原生 HTML 属性,用来临时覆盖 <form> 的 action 属性。它不依赖 JavaScript,纯 HTML 就能实现「一个表单、多个提交目标」——比如保存草稿走 /api/draft,发布正文走 /api/publish。
关键点在于:只有点击带 formaction 的按钮时,才用它的值发请求;其他按钮或回车提交,仍走 <form action="..."> 的默认地址。
怎么写才能让保存和发布按钮各走各的接口?
必须确保:
- 表单本身有基础
action(可设为默认行为,比如发布) - 保存按钮显式声明
formaction="/api/draft" - 发布按钮可以不写
formaction(复用表单 action),或显式写成formaction="/api/publish" - 两个按钮都得是
type="submit",否则不会触发表单提交
<form action="/api/publish" method="POST"> <input name="title" /> <textarea name="content"></textarea> <p><button type="submit" formaction="/api/draft">保存草稿</button> <button type="submit">立即发布</button> </form>
注意:formmethod 可以配合 formaction 单独设置请求方法(比如保存用 POST,预览用 GET),但多数场景保持一致更稳妥。
立即学习“前端免费学习笔记(深入)”;
容易踩的坑:为什么点了保存按钮还是跳转到发布接口?
常见原因有三个:
- 按钮漏写了
type="submit",变成普通button,不触发提交 -
formaction值写错路径,比如少了个斜杠,导致 404 后浏览器 fallback 到表单默认 action - 表单里混用了
onsubmit或 JavaScript 阻止了默认行为,结果所有按钮都走 JS 逻辑,formaction被忽略 - 在 Safari 或旧版 Edge 中,如果
formaction值是相对路径且表单在 iframe 里,解析可能出错,建议统一用绝对路径或以/开头的路径
要不要加 CSRF token 或其他隐藏字段?
要,而且得动态处理。CSRF token 通常由后端注入,对所有提交路径都有效,所以放在 <form> 内就行:
<form action="/api/publish" method="POST"> <input type="hidden" name="csrf_token" value="abc123"> <!-- 其他字段 --> <button type="submit" formaction="/api/draft">保存草稿</button> </form>
但注意:如果保存接口要求额外字段(比如 status=draft),不能只靠后端判断,最好显式带上:
<button type="submit" formaction="/api/draft"> <input type="hidden" name="status" value="draft" /> 保存草稿 </button>
不过这种写法需要把 <input> 放进 <button> 里(HTML5 允许),否则得用 JS 动态注入——这时候就超出纯 formaction 能力了。
后端路由设计、状态校验、重复提交防护这些,不在 formaction 覆盖范围内,该加的还得加。



















