formmethod 是 html 原生表单的静态属性,不支持 js 动态修改,浏览器在点击瞬间锁定其值,仅接受 "get" 和 "post";动态切换需用 js 拦截提交并 fetch 手动发请求。

formmethod 属性只能静态声明,不能用 JS 动态修改
直接说结论:formmethod 是 HTML 原生表单的**静态属性**,浏览器不支持运行时通过 element.setAttribute('formmethod', 'post') 或 button.formMethod = 'get' 来切换它——改了也没用,提交时仍按初始值执行。
常见错误现象:你用 JS 改了按钮的 formmethod,点提交后还是发 GET;或者控制台能看到属性变了,但 Network 面板里请求方法没变。这是因为浏览器在点击瞬间就锁定了该按钮的 formmethod 值,后续 DOM 修改不触发重解析。
- 必须在 HTML 中写死,比如
<button type="submit" formmethod="get">查看</button> - 想“动态切换”,本质是得换按钮或换表单逻辑,不是改属性
- 部分旧 WebView(如 Android 4.4 内置)甚至会忽略 JS 设置的
formmethod,直接 fallback 到<form></form>的method
真正能动态控制提交方式的替代方案
要实现“点不同按钮走不同 method”,得绕过 formmethod 的限制,用 JS 拦截并手动发请求。
- 给所有按钮加
type="button"(不是submit),避免原生提交 - 用
addEventListener('click')捕获点击,读取表单字段值 - 用
fetch()手动构造GET或POST请求:-
GET:拼 URL +URLSearchParams,如fetch(action + '?' + new URLSearchParams(formData)) -
POST:传body: new URLSearchParams(formData)或JSON.stringify()(注意后端接收逻辑)
-
- 别忘了设
event.preventDefault(),否则原生提交会和 fetch 并行发生
为什么不能靠 formmethod 实现 RESTful 的 delete/put
写了 formmethod="delete" 就以为能发 DELETE 请求?不行。所有主流浏览器(Chrome/Firefox/Safari/Edge)都会静默忽略非法值,退回到 <form></form> 的 method(通常是 post)。
-
formmethod只接受"get"和"post"两个小写字符串,大小写敏感 -
POST(大写)在某些 Android WebView 中会被当无效值,降级为get - 想发
DELETE、PUT、PATCH,必须用 JS +fetch()或XMLHttpRequest,且后端要配 CORS - 顺带一提:
formaction也一样——不配它,formmethod就白设;配了它,地址变了但 method 还是只认那俩合法值
最容易被忽略的兼容性坑
你以为改个属性就完事,其实连“表单字段怎么取”都得跟着 method 变。
- 用
GET提交,后端必须从 query string 取值(如req.query.name),而不是req.body - 用
POST提交,如果没配好enctype="application/x-www-form-urlencoded"或后端没启用urlencoded解析中间件,req.body就是空对象 - 表单里有
<input name="id" value="123">,而action本身带参数如action="/user?id=456",用GET提交时,id=123会覆盖 URL 里的id=456,后端收不到原始值 - 刷新页面时,
GET请求可安全重放,POST会弹确认框——但这不能防重复提交,后端必须做幂等校验(比如用 token 或唯一订单号)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











