formmethod仅对type="submit"或type="image"有效,type="button"等无效;必须配合formaction使用才能改变提交地址;多个submit按钮需设name属性才能向后端传递点击标识。

formmethod 只对 type="submit" 生效,type="button" 写了也白写
如果你给 <button> 加了 formmethod="post" 却没生效,第一反应该检查它的 type 属性。它只响应 type="submit"(或 type="image"),type="button"、type="reset" 或完全不写 type(此时默认是 type="submit")都不行。
常见错误写法:
-
<button formmethod="post">提交</button>—— 缺type="submit",浏览器直接忽略formmethod -
<button type="button" formmethod="post">点我</button>——type="button"不触发提交,属性被静默丢弃 -
<form method="get"><button type="submit" formmethod="POST">搜</button></form>——POST大写,在部分旧浏览器中降级为get
formmethod 必须和 formaction 配合,否则地址还是原来那个
formmethod 只改请求方法,不改目标地址。点了「预览」按钮却把数据发到 /save,大概率是因为没配 formaction。
正确组合示例:
立即学习“前端免费学习笔记(深入)”;
<form action="/api/save" method="post"> <input name="title"> <button type="submit" formmethod="get" formaction="/api/preview">预览</button> <button type="submit">保存</button> </form>
这里两个按钮都属于同一个表单,但:
- 「预览」走
GET /api/preview?title=xxx - 「保存」走
POST /api/save,用表单默认method和action
formaction="" 不是“当前页”,而是回退到表单的 action;想真正清空地址,得写 formaction="javascript:void(0)" 或靠 JS 拦截。
后端收不到按钮名?缺 name 属性是高频盲区
多个 type="submit" 按钮共存时,只有被点击的那个会作为键值对随请求发出,前提是它有 name。没设 name,后端就只能猜用户点了哪个按钮。
例如:
<button type="submit" name="action" value="draft">存草稿</button> <button type="submit" name="action" value="publish">发布</button>
点击「发布」,后端收到 action=publish;若没写 name,这个字段根本不会出现在请求里。
注意:
-
value会拼进 URL(GET时)或请求体(POST时),别放敏感内容 -
GET提交受 URL 长度限制(通常 ≤2KB),大文本或文件上传必须用POST+enctype="multipart/form-data" -
formmethod="get"遇到enctype="multipart/form-data"会被浏览器自动降级为表单默认method,因为GET不支持文件上传
IE9 及更早版本不认 formmethod,兼容方案得靠 JS
Chrome 10+、Firefox 4+、Safari 5.1+、Edge 全支持,但 IE9 及以下完全忽略 formmethod 和 formaction。如果项目还要兼容这些老版本,不能只靠 HTML 属性。
可行替代方案:
- 用
event.preventDefault()拦住原生提交,再用fetch手动发请求,自己控制method和url - 动态改表单的
method和action属性:form.method = 'post'; form.action = '/preview'; form.submit(); - 所有按钮统一用
type="button",靠 click 事件分发不同逻辑,彻底绕过原生表单机制
最后提醒一句:一旦用了 event.preventDefault(),formmethod 就彻底失效——它只参与原生提交流程,不是 JS 可读取的配置项。



















