formaction属性仅适用于和元素,可原生覆盖表单action实现多目标提交;值必须为合法url,优先级最高,且需配合formmethod等属性协同使用。

formaction 属性是唯一能原生覆盖 form 的 action 的方式,不用 JS 就能实现一个表单多个提交目标——但必须用对元素、写对值,否则浏览器直接忽略。
哪些元素能用 formaction?
只有 <button type="submit"></button> 和 <input type="submit"> 支持 formaction。其他按钮(比如 type="button")或普通链接完全无效。
-
formaction不会作用于<input type="image">或<input type="reset">,哪怕它们也触发提交 - 如果按钮没写
type="submit",部分浏览器仍当提交按钮处理,但formaction一定不生效——务必显式声明 -
<button></button>没加type属性时行为不一致(Chrome 默认 submit,Firefox 可能不触发),别赌浏览器默认
formaction 值怎么写才有效?
formaction 值必须是合法 URL,且优先级高于 form 的 action,但它不会自动补全路径或协议。
- 写相对路径如
formaction="api/save":以当前 HTML 文件所在目录为基准,不是以form的action为基准 - 写绝对路径如
formaction="/api/delete":从域名根开始解析,最稳,推荐用于生产环境 - 跨域必须写完整 URL,如
formaction="https://api.example.com/v1/submit",否则浏览器报 CORS 错误,且后端必须响应Access-Control-Allow-Origin - 不能写
formaction="handler.php"这类无协议、无路径前缀的裸文件名——Web Server 很可能找不到路由
和 formmethod、formtarget 一起用要注意什么?
formmethod 和 formtarget 是配套属性,但它们只对当前按钮生效,和其他按钮互不影响。
-
formmethod="get"会强制走 GET,即使form设了method="post";含文件上传的表单不能用 GET,formmethod="get"在这种按钮上等于废掉 -
formtarget="_blank"会让响应在新标签页打开,但若后端返回的是 JSON 或空响应,用户只会看到空白页——这不是 bug,是预期行为 - 多个按钮分别设了
formaction+formmethod,但都指向同一个后端接口,却用了不同 method(比如一个 POST、一个 GET),后端必须同时监听两个方法,否则 405 -
formnovalidate可绕过该按钮触发的 HTML5 表单校验,适合“暂存草稿”类按钮,但别滥用——它不阻止 JS 校验
容易被忽略的兼容性与调试点
看似简单,但真正在老系统或嵌套路由下出问题时,往往卡在几个细节上。
- Vue Router / React Router 的 history 模式页面里,
formaction="/api/xxx"没问题,但formaction="api/xxx"可能被前端路由劫持,变成 404 - 本地双击打开 HTML(
file://协议),所有formaction提交都会失败,因为浏览器禁止 file 协议发起跨源请求——必须起本地 server - 调试时用浏览器 DevTools 的 Network 面板看实际发出的请求地址,别只信 HTML 源码;点击哪个按钮,就过滤对应请求,确认
formaction是否被正确采用 -
form上写了novalidate,但某个formaction按钮加了formnovalidate,那这个按钮确实跳过校验;但其他没加的按钮仍受form级校验约束
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











