formaction属性仅对type="submit"或type="image"的按钮生效,可覆盖form的action,但ie不支持需js降级处理。

formaction 属性必须用在 type="submit" 或 type="image" 的按钮上
它不是通用属性,不能加在 input type="text" 或普通 button 上(除非显式设 type="submit")。浏览器会直接忽略无效用法,表单仍走 <form></form> 的 action。
常见错误是写成:<button>提交</button> —— 这个没设 type,默认是 type="button",formaction 完全不生效;正确写法是:<button type="submit" formaction="/admin">管理员提交</button>。
-
formaction只对type="submit"和type="image"生效,type="button"不触发表单提交,自然也不读该属性 - 相对路径(如
formaction="api/save")和绝对路径(如formaction="https://api.example.com/v1/submit")都支持 - 如果同时用了
formmethod、formenctype,它们会一起覆盖对应表单属性,但只作用于当前按钮的这一次提交
多个提交按钮共存时,formaction 优先级高于 form 的 action
只要某个按钮带了 formaction,点它就一定发往那个地址,不管 <form action="/default"></form> 写得多明确。这个覆盖是单次、即时、无副作用的——不影响其他按钮,也不改变表单本身的状态。
示例中两个按钮:<input type="submit" value="普通提交"> 走 /default;<input type="submit" formaction="/quick-buy" value="立即购买"> 则强制走 /quick-buy,哪怕表单里还配了 enctype="multipart/form-data",它也不会继承,除非你额外加 formenctype。
- 没有
formaction的按钮,完全按<form></form>原始配置提交 - 有
formaction的按钮,其formmethod、formtarget、formenctype、formnovalidate全部独立生效,互不干扰 - 不要指望 JS 修改按钮的
formaction属性后立刻生效——它只在下一次点击时起作用,且修改后不会回写到表单默认值
IE 不支持 formaction,需要降级处理
IE 11 及更早版本完全忽略 formaction,所有按钮都会退回到 <form></form> 的 action。如果你的业务仍需兼容 IE,不能只靠 HTML 属性兜底。
可行的降级方案是:给每个按钮加唯一 data-action,用 JS 拦截 submit 事件,读取触发按钮的 data-action,再手动设置 form.action 并调用 form.submit()。注意别漏掉 event.preventDefault(),否则会先走原生提交再走 JS,造成重复请求。
- 现代浏览器中,
formaction是零 JS 解决方案,简洁可靠 - 一旦引入 JS 降级逻辑,就要同步处理
formmethod、formtarget等配套属性,否则行为不一致 - 移动端 Safari 和 Chrome for Android 自 2015 年起已完整支持,无需额外 polyfill
form 属性可让 input 绑定到非父级 form,但和 formaction 无关
有人混淆 form 属性(用于把 input 关联到页面任意位置的 <form id="xxx"></form>)和 formaction。二者定位完全不同:form 解决的是“控件归属”,formaction 解决的是“提交去向”。一个 input 可以通过 form="myform" 属于某个表单,但它自己不能指定提交地址——只有它的提交按钮才能用 formaction 改变目标。
典型误用:<input type="text" form="main-form"><button type="submit" formaction="/api"></button> —— 这没问题;但若写成 <input type="submit" form="main-form" formaction="/api">,就多余了,因为 form 属性对 input[type=submit] 无效(它本就属于最近的 <form></form>)。
-
form属性只对非表单子元素的控件有意义,比如放在<div> 里的 <code>input -
formaction必须出现在提交触发器上,不能挪到普通输入控件上 - 两者叠加使用场景极少,多数时候选其一即可:要跨结构收数据,用
form;要多地址提交,用formaction
表单提交地址的覆盖机制看似简单,但关键点藏在属性生效条件和浏览器兼容性边界里。最容易被忽略的是:按钮类型必须为
submit,且 IE 下整个能力链断裂——这时候光补 JS 不够,还得同步模拟 formmethod 和 formtarget 行为,否则降级后功能残缺。











