formaction 属性允许为表单内不同提交按钮指定独立提交地址,优先级高于表单 action,仅作用于 type="submit" 的 button 或 input 元素,配合 formmethod 和 formenctype 可进一步控制请求方式与编码类型。

HTML5 的 formaction 属性允许你为同一个表单内的不同提交按钮指定**独立的提交地址**,从而在不写 JavaScript 的前提下,实现“保存草稿”和“正式发布”两种行为的分离。
formaction 的基本用法
它只作用于 <button type="submit"> 或 <input type="submit"> 元素,优先级高于表单本身的 action 属性。浏览器点击哪个按钮,就按其 formaction 值发送请求(若未设置,则回退到表单的 action)。
示例:
<form method="POST"><input name="title" placeholder="标题">
<textarea name="content"></textarea>
<button type="submit" formaction="/api/save-draft">保存草稿</button>
<button type="submit" formaction="/api/publish">立即发布</button>
</form>
后端需配合处理不同路径
两个 formaction 指向不同 URL,意味着后端要提供两个独立接口,分别处理逻辑差异:
立即学习“前端免费学习笔记(深入)”;
-
/api/save-draft:只校验基础字段(如标题非空),存入数据库并标记
status = 'draft',返回成功即可 -
/api/publish:做更严格校验(如内容长度、敏感词、封面图必填等),存入同时设
status = 'published',可能触发通知或索引更新
注意事项与常见问题
使用时需注意以下几点,避免意外行为:
- 按钮必须在
<form>内部,且type="submit",否则formaction不生效 - 若按钮有
form属性(指向页面中另一个表单 ID),则以该表单为准,formaction仍有效,但提交的是目标表单的数据 - 不支持 GET 请求的语义化区分(比如用 query 参数),因为
formaction是完整 URL,建议统一用 POST + 路由区分 - 无法阻止默认提交,如需前置验证(例如确认发布),仍需搭配
onclick="return confirm(...)"或监听submit事件
进阶:配合 formmethod 和 formenctype
可进一步控制每个按钮的请求方式与编码类型:
<button type="submit"formaction="/api/save-draft"
formmethod="POST"
formenctype="application/x-www-form-urlencoded">保存草稿</button>
<button type="submit"
formaction="/api/publish"
formmethod="POST"
formenctype="multipart/form-data">带附件发布</button>
例如上传图片时,发布按钮可单独启用文件编码,而保存草稿保持默认编码,避免无谓开销。



















