formmethod仅对type="submit"或type="image"控件生效,必须配合formaction使用,且只在原生提交时临时覆盖请求方式为get/post;type="button"等非提交控件无效,put/delete等值会被静默降级为get。

直接说结论:formmethod 只对 type="submit" 或 type="image" 的控件生效,且必须配合 formaction 使用;它不是万能的“覆盖开关”,而是一次性、局部、原生提交专用的临时覆盖机制。
为什么加了 formmethod="post" 还是发 GET?
最常见原因是按钮类型错了——type="button" 根本不触发表单提交,formmethod 对它完全无效。浏览器只在真正提交时读取这个属性。
- 必须用
<button type="submit"></button>或<input type="submit"> - 按钮必须在
<form></form>标签内,或通过form="form-id"显式关联到某个表单 -
formmethod单独写没用,必须和formaction同时存在(哪怕formaction值和<form></form>的action一样) - 如果表单外层被 JS 拦截(比如
onclick="event.preventDefault(); fetch()"),那formmethod就永远不会执行
formmethod 的值只能是 get 或 post
HTML 规范只定义了 formmethod="get" 和 formmethod="post" 两种合法值;写 put、delete 等会被多数浏览器静默降级为 get,不会报错,但请求方式已失控。
-
formmethod="get":数据拼进 URL,适合搜索类操作,但敏感字段(如 token、密码)绝不能走这里 -
formmethod="post":数据放请求体,是修改类操作(删除、提交、登录)的合理选择 - 别指望靠
formmethod实现 RESTful 风格的 PUT/DELETE —— 必须用fetch或XMLHttpRequest手动发
formmethod 是“一次性的”,不是永久修改
它只影响当前按钮点击触发的这一次提交,不影响表单本身的 method 属性,也不影响其他提交控件的行为。
- 同一表单里可以有多个 submit 按钮,各自带不同
formmethod,互不干扰 - 点完
formmethod="post"按钮后,再点另一个没设formmethod的 submit 按钮,仍按<form method="get"></form>执行 - 刷新页面后,所有临时覆盖全部失效,回到表单原始配置
- 服务端必须能接收对应 method 的请求,否则必然返回
405 Method Not Allowed
兼容性和降级要注意什么?
formmethod 在 IE10 及以下版本不支持,而且部分老旧安卓 WebView 也有类似问题。不能把它当作唯一控制手段。
- 关键操作(如删除账号)建议双保险:前端用
formmethod="post"+ 后端校验请求 method 是否为 POST - 若需兼容老环境,可用 JS 动态改
form.method,但要注意避免破坏原生验证逻辑 - 别把
formmethod和 JS 提交混用——一旦调了event.preventDefault(),它就彻底失效了 - 调试时别只看 HTML 源码,务必打开 Chrome DevTools 的 Network 面板,确认实际发出的
Request Method是什么
最容易被忽略的一点:它只在「原生表单提交」路径下起作用。只要中间有任何 JS 拦截、重定向、手动 submit() 或 fetch,formmethod 就退场了——这时候控制权已经移交给了 JavaScript。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











