formaction 属性仅对 type="submit" 的按钮生效,会完全取代表单 action,只修改提交地址而不影响请求方法;其 URL 解析规则同 href,优先级由浏览器硬编码决定,无法被 JS 或 CSS 拦截。

formaction 会完全接管 submit 按钮的提交目标
不是“覆盖”,而是浏览器在点击该按钮时,压根不读 form 的 action。只要按钮是 type="submit",且带有 formaction 属性,就一定走这个 URL。
常见误判是加了 formaction 却没生效——八成是因为按钮类型不对:
-
<button type="button"></button>:无效,必须是type="submit" -
<input type="button">:无效,得用type="submit"或type="image" -
<button></button>没写type:部分浏览器默认为submit,但不可靠,务必显式声明
formaction 只对 submit 类型生效,和 form 的 method 无关
formaction 不影响请求方法(GET 还是 POST),它只改地址。请求方式仍由 <form method="..."></form> 决定,或由按钮所在表单继承。
这意味着你不能用 formaction 把一个 GET 表单的某个按钮改成 POST 提交——那是 method 的职责,而 formaction 没有对应属性。
立即学习“前端免费学习笔记(深入)”;
典型场景举例:
- 同一张订单页,
<button type="submit" formaction="/cart/add">加入购物车</button>和<button type="submit" formaction="/order/checkout">立即下单</button>,都走POST,但后端路由不同 - 如果表单本身是
method="get",那两个按钮也都是GET,只是 query 参数发往不同 endpoint
兼容性坑点:IE9 及更早版本不支持 input 的 formaction
<input type="submit" formaction="..."> 在 IE9 及以下完全被忽略,会退回到 <form></form> 的 action;但 <button type="submit" formaction="..."></button> 在 IE10+、Chrome 9+、Firefox 4+、Safari 5.1+ 都可用。
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
所以如果你还要兼容老 IE(比如企业内网场景),别用 <input> 的 formaction,统一改用 <button></button> 写法,或者干脆用 JS 动态改 form.action。
顺带一提:formaction 是 HTML5 新增属性,没有 polyfill 能让它在 IE9 下“真正生效”——JS 模拟只能做到行为近似,不是原生语义。
formaction 的 URL 是相对还是绝对?取决于当前文档位置
formaction 值的解析规则和 <a href></a> 一致:以 / 开头是根路径,以 http:// 或 https:// 开头是绝对 URL,其他情况是相对于当前页面 URL 的路径。
容易出错的是这种写法:formaction="api/submit" —— 如果用户当前在 /product/detail?id=123,实际提交地址会是 /product/api/submit,而不是你预期的 /api/submit。
建议做法:
- 后端统一用根路径,如
formaction="/api/cart/add" - 避免依赖当前页面路径推导,否则 SPA 路由(如
/app/#/settings)下更容易错乱 - 调试时直接看浏览器 DevTools 的 Network 标签页里发出的请求 URL,比猜靠谱
真正容易被忽略的是:formaction 的优先级是硬编码进浏览器行为里的,没法被 CSS 或 JS 中间拦截——你甚至不能在 submit 事件里通过 event.target 拿到它(得手动查 event.submitter?.formAction)。所以想做统一提交前校验,得提前把逻辑耦合进按钮本身,而不是寄希望于表单级监听。


















