form 的 method 属性仅支持 get 和 post,其他值如 put、delete 会被浏览器静默降级为 get;大小写不敏感,但非法值不报错;需用 fetch 或 XMLHttpRequest 发送非 get/post 请求。

method 属性只能设为 get 或 post,其他值(比如 put、delete)会被浏览器静默降级为 get,不会报错,但后端根本收不到预期请求。
form 的 method 属性只认 get 和 post
HTML 规范明确限定 method 只接受两个合法值:get 和 post。哪怕你写成 method="POST"(大写)、method="Get"(首字母大写),浏览器也照常识别——大小写不敏感。但一旦写成 method="put",Chrome、Firefox、Safari 全部当作 get 处理,Network 面板里看到的 Request Method 就是 GET,后端收不到 PUT 请求。
get 和 post 的实际行为差异在哪
不是“get 刷新页面、post 不刷新”,而是数据载体和浏览器默认行为不同:
-
get把所有字段拼进 URL 查询字符串(如?q=hello&page=2),所以能被书签保存、被缓存、出现在浏览器地址栏——别传密码或 token -
post把字段放在请求体(request body)里发送,URL 干净,无长度限制(理论上),但刷新会触发“重复提交确认”弹窗 - 跳转与否,取决于
action指向的是 HTML 页面还是 API 接口;如果后端返回 JSON,页面就不会跳,跟method无关
想用 PUT/DELETE?得绕过原生 form
原生 <form> 不支持 put 或 delete,硬写只会降级。真要发这些方法,必须用 JavaScript:
- 用
fetch()手动构造请求:fetch('/api/user/123', { method: 'PUT', body: JSON.stringify(...) }) - 或者用
XMLHttpRequest,设置request.open('DELETE', url) - 某些后端框架(如 Django)允许在
post表单中加隐藏字段<input name="_method" value="put">,由服务端解析并转义——但这不是浏览器行为,是框架约定
formmethod 能临时覆盖 method,但有严格限制
formmethod 是 HTML5 属性,只对 <input type="submit"> 或 <button type="submit"> 生效,且仅影响该按钮点击时的提交行为:
立即学习“前端免费学习笔记(深入)”;
- 它完全覆盖外层
<form method="get">,哪怕表单设了get,按钮也能单独发post - 但
formmethod="put"无效,一样降级为get - JS 调用
form.submit()时,formmethod不起作用,仍走<form>的method - 按钮设成
type="button"就彻底无视formmethod
method 就万事大吉,但实际发出的请求方法,必须去 Chrome DevTools 的 Network 标签页里看 Request Method 字段——那里才是真相。很多问题不是写错了,而是 JS 拦截了 submit 事件却没发请求,或者 enctype 没配对导致 POST 数据为空。



















