不能。formmethod仅适用于type="submit"的button或input元素,对type="button"无效;它可覆盖form的method属性,但仅限get、post、dialog及部分浏览器支持的put/patch,且需按钮位于form内或通过form属性关联。

formmethod 能不能用在普通 button 上
不能。formmethod 是 <input type="submit"> 和 <button type="submit"> 的原生属性,但只在它们作为表单提交触发器时生效。如果你给一个 type="button" 的按钮加 formmethod,浏览器完全忽略它——既不报错,也不起作用。
想临时改提交方式,必须用 type="submit"
只有 type="submit" 的按钮才能响应 formmethod。它会覆盖 <form> 标签上声明的 method(比如 method="get"),仅对当前点击生效:
<form action="/api/user" method="get"> <input name="id" value="123"> <button type="submit" formmethod="post">用 POST 提交</button> <button type="submit" formmethod="put">用 PUT 提交</button> </form>
注意:formmethod 只影响 HTTP 方法,不影响 action 或 enctype;如果需要改 enctype,得配 formenctype。
常见错误:点击后还是 GET 或没反应
- 按钮写了
type="button"—— 改成type="submit" - 按钮不在
<form>内部,也没用form="form-id"关联表单 - 用了不被支持的 method 值,比如
formmethod="delete"(浏览器只认get、post、dialog,部分支持put/patch,但服务端未必处理) - 表单里同时有多个 submit 按钮,但没设
name或value,导致后端无法区分操作意图
兼容性与替代方案的现实约束
formmethod 在 Chrome 58+、Firefox 69+、Edge 79+ 中稳定支持,但 Safari 直到 16.4 才完整支持 put/patch。如果项目需兼容老 Safari 或要求精确控制请求头(比如带 X-HTTP-Method-Override),别依赖 formmethod,改用 JS 手动构造 fetch 更可靠:
立即学习“前端免费学习笔记(深入)”;
document.querySelector('[data-method="put"]').addEventListener('click', e => {
e.preventDefault();
fetch('/api/user', {
method: 'PUT',
body: new FormData(document.querySelector('form'))
});
});
真正容易被忽略的是:表单默认提交会刷新页面,而 formmethod 不改变这一行为;如果要静默提交或处理响应,JS 方案反而是更可控的选择。



















