formmethod仅对type="submit"或type="image"有效,值必须小写(get/post),需配合formaction使用,不支持DELETE/PUT,旧浏览器大小写敏感。

formmethod 只对 type="submit" 和 type="image" 有效
写 <button formmethod="post"> 却没加 type="submit",浏览器直接忽略该属性;<input type="button" formmethod="get"> 同样无效。它不看标签名,只认 type 值是否为 submit 或 image。
常见错误现象:
-
<button formmethod="get">预览</button>—— 缺type="submit",完全不生效 -
<input type="text" formmethod="post">—— type 不匹配,被静默丢弃 -
<button type="submit" formmethod="GET">—— 大写GET,部分 Android WebView 或旧 Safari 会降级为默认 method
实操建议:
- 务必显式写
type="submit"(哪怕<button>默认行为是提交,也必须声明) - 值严格用小写:
get或post,别写Get、POST、delete - 搭配
formaction使用才有意义——单独设formmethod不改地址,只改方法
formmethod="post" 但后端收不到数据?检查是否漏了 formaction
formmethod 只改请求方法,不改提交地址。如果表单本身 action="/save",而你点的是 <input type="submit" formmethod="get" value="预览">,那请求仍发往 /save,只是变成 GET,参数全拼在 URL 上。
立即学习“前端免费学习笔记(深入)”;
后果很直接:
- 后端用
req.body(Node.js)或$_POST(PHP)接收 → 收到空对象/数组 - 前端开发者工具 Network 面板里能看到 Request Method 是 GET,但 Headers → Query String Parameters 里有数据,Request Payload 为空
- URL 变得极长,中文乱码(若未正确编码),甚至触发 414 URI Too Long
实操建议:
- 需要不同 endpoint + 不同 method 的按钮,必须同时设
formaction和formmethod:<input type="submit" formmethod="get" formaction="/preview" value="预览"> - 不要指望靠
formmethod="get"把 POST 表单“安全地”转成查询——它只是把原 POST 字段强行塞进 URL,字段语义和后端预期已错位
想用 DELETE/PUT?别碰 formmethod,用 JS 拦截
HTML 原生表单根本不支持 DELETE、PUT 等方法。formmethod="delete" 在 Chrome/Firefox 中会被静默降级为 get;Safari 可能也当没看见;IE 10+ 直接忽略整条属性。
真实场景中,这类操作往往对应「删除某条记录」「更新资源状态」,后端只监听 DELETE /api/items/123,你靠 <form method="delete"> 根本发不出这个请求。
实操建议:
- 放弃
formmethod或method属性实现 RESTful 方法 - 用
event.preventDefault()拦住提交,再用fetch()手动发请求:fetch('/api/items/123', { method: 'DELETE' }) - 如果必须保留表单结构(比如复用已有 input),可把
<button type="button">绑定 click 事件,而不是依赖原生 submit 流程
兼容性与大小写:IE10+ 支持,但大小写敏感是硬要求
formmethod 是 HTML5 新增属性,IE9 及更早版本完全不支持。现代浏览器(Chrome、Firefox、Safari、Edge、IE10+)都支持,但行为细节有差异。
最容易被忽略的坑是大小写:
-
formmethod="Post"或formmethod="GET"→ 在部分 Android WebView、iOS 12 以下 Safari、旧版 IE 中,可能被当作非法值,回退到<form>的默认method - 没有警告、没有报错、没有控制台提示,只有 Network 里看到的请求方法和你预期不符
实操建议:
- 所有
formmethod值强制小写:get、post,别做任何首字母大写或全大写尝试 - 如需支持 IE9 及以下,只能用 JS 动态改
form.method(如form.method = 'get'),并确保按钮是type="button"+ click 事件驱动 - 上线前务必在目标兼容范围内开 Network 面板验证实际发出的
Request Method,别信 HTML 代码里的写法
formmethod 看似简单,但它的生效链条极短:type 必须对、值必须小写、必须配 formaction 才有意义、不能越界用 REST 方法。最容易出问题的地方,往往不是“怎么写”,而是“写了但浏览器根本没认”。



















