
name属性必须相同,否则浏览器不认为是同一组
多选框(type="checkbox")能否被后端当作一组值接收,完全取决于它们的 name 是否**字面量完全一致**:大小写、空格、拼写都不能差一点。比如 hobby 和 Hobby 是两组,用户可以同时勾选两个;user_role 和 user-role 也互不干扰。
常见错误是前端用不同命名(如一个写 interests,另一个写 hobbies),结果后端只收到零散单值,无法还原为数组。
- ✅ 正确:
<input type="checkbox" name="tag" value="js">+<input type="checkbox" name="tag" value="html"> - ❌ 错误:
name="tag"和name="tags"混用 - ⚠️ 注意:DOM顺序决定提交顺序,不是视觉排列——别靠CSS把第二个checkbox“拖”到前面就以为它会第一个提交
要不要加方括号(如 name="tag[]")?取决于后端框架
name="tag[]" 不是HTML标准要求,而是PHP、Laravel、Rails等框架的解析约定。原生HTML提交时,无论你写 name="tag" 还是 name="tag[]",浏览器都发出相同的键值对形式:tag=js&tag=html。
区别在于服务端怎么处理:
- PHP:
$_POST['tag']自动是数组,$_POST['tag[]']会报错(因为键名带方括号) - Express.js +
body-parser:默认只得到{ tag: ['js', 'html'] },tag[]反而变成键名"tag[]",需额外中间件转换 - Django:默认忽略方括号,
request.POST.getlist('tag')才能取多值;写name="tag[]"对它没用
所以别盲目加 [],先确认后端是否真需要它。
name为空、含空格或点号,会导致后端收不到值
name 值只要为空字符串、纯空格,或含 .、[、]、中文、空格,某些后端解析器会直接跳过该字段——不是报错,而是静默丢弃。
- ✅ 安全写法:
name="user_tags"、name="project_type" - ❌ 高危写法:
name="user tags"(空格)、name="user.tags"(点号)、name=""(空)、name="标签"(中文) - ⚠️ 特别注意:
name="tags"和name="tags[]"在同一个表单里不能混用,否则后端可能只取其一或解析混乱
同名控件不止 checkbox,还要小心 hidden 和 radio 的覆盖行为
多个同名控件不总是“合并成数组”。浏览器按类型区别对待:
-
checkbox:只提交勾选项,未勾选的不出现 -
radio:只提交选中的那个,其余同名项不参与提交 -
hidden:如果和checkbox同名且在DOM中更靠后,它的值会覆盖所有勾选项——因为它是“最后出现的同名字段”
比如:<input type="hidden" name="status" value="draft"> 放在所有 checkbox 后面,哪怕用户勾了三个选项,后端收到的永远是 status=draft。
容易被忽略的是:动态插入的 checkbox 如果没显式设置 name,哪怕 clone 了原有元素,也可能丢失 name 属性,导致提交失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











