name属性是表单提交的唯一键名,无name的控件不会被提交;同名控件按类型决定数据行为:radio单值、checkbox多值、select multiple数组、hidden被后续同名覆盖;name与id功能无关,动态创建时须显式设置name。

name属性是表单数据提交的唯一键名
没有 name 属性的表单控件,浏览器根本不会把它包含在提交数据中——哪怕它有值、被用户填了、甚至设置了 id 或 class。这是最常被忽略的底层规则。
-
<input type="text">没写name→ 提交时彻底消失 -
<input type="checkbox" name="hobby">和<input type="radio" name="gender">必须同名才能形成逻辑组,否则多选/单选失效 -
name值会直接成为 HTTP 请求体中的键(如application/x-www-form-urlencoded中的username=alice&hobby=reading)
name值不能含空格或特殊字符,否则后端解析可能出错
虽然浏览器允许 name="user name" 或 name="user-name",但部分后端框架(如 PHP 的 $_POST、某些 Go 表单解析库)会把带空格或点号(.)的 name 当作非法键名,静默丢弃或触发警告。
- ✅ 推荐用下划线或中划线:
user_name、profile_image - ❌ 避免:
user name(空格)、user.name(点号)、user[name](方括号,除非明确需要数组式提交) - ⚠️ 特殊场景如需嵌套结构(如
user[address][city]),得确认后端是否支持这种命名约定(Laravel、Rails 默认支持;Express 默认不解析)
多个同名控件提交时,行为取决于控件类型
同名不是错误,而是设计机制。但不同控件对“同名”的处理逻辑完全不同,直接影响你拿到什么数据:
-
<input type="radio">:只提交被选中的那个值(即使多个同名,最终只有一个值) -
<input type="checkbox">:只提交所有勾选项的值;若全未勾选,则该name不出现在提交数据中 -
<select multiple></select>:提交所有选中项,用数组形式(如hobby[]=reading&hobby[]=coding),但需后端主动识别[]后缀 -
<input type="hidden">与文本框同名?后者值会覆盖前者——顺序决定优先级(后出现的同名字段覆盖前面的)
name和id属性完全无关,别混用
id 用于 DOM 定位(document.getElementById()、CSS 选择器、<label for="xxx"></label> 关联),name 专用于表单提交。两者可以相同,也可以不同,但功能绝不交叉。
- 写了
id="email"却漏了name="email"→ 用户输入了也白输 - 用 JS 动态创建控件时,必须显式设置
el.name = "xxx",仅设el.id无效 - 使用
FormData构造函数收集数据时,同样只认name,不看id
name,或者误用 key 当 name,导致提交数据错乱或缺失。











