火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

多选题表单怎么搭:name、value 与提交结构

发布于 1周前
1

多选题表单的复杂度不在外观,而在提交结构。同一组选项要能被服务端当成数组接收,未选中的项不能出现在请求里,用户对选中项的个数限制也要落到可校验的位置。

手持纸质文件并使用笔记本电脑的场景,用于说明多选题表单的填写与提交
多选题提交后同名参数重复出现,服务端按数组接收

结构与命名

<fieldset>
  <legend>常用来源渠道</legend>

  <label><input type="checkbox" name="source[]" value="search"> 搜索</label>
  <label><input type="checkbox" name="source[]" value="social"> 社交</label>
  <label><input type="checkbox" name="source[]" value="friend"> 推荐</label>
</fieldset>
  • 同一组的 name 完全一致,带 [] 后缀便于服务端解析为数组;
  • value 必须写且各不相同,空 value 提交时只剩 source[]=on,无法区分选项;
  • label 包裹控件,点击文字即可切换,不必手写 for 与 id。

服务端接收

$sources = $_POST['source'] ?? [];
$allowed = ['search', 'social', 'friend'];
$sources = array_values(array_intersect($sources, $allowed));

未勾选的复选框不参与提交,服务端收不到任何同名参数,因此取值前要给出默认值。取值后与白名单求交集,避免客户端伪造的 value 进入后续逻辑。

required 的边界

required 加在复选框上时,含义是「这一项必须被勾选」。给同组每一项都加上,等于要求全部勾选,与「至少一个」的诉求相反。组级别的个数限制没有原生属性可用,需要走 constraint validation API:

form.addEventListener('change', () => {
  const checked = form.querySelectorAll('input[name="source[]"]:checked').length;
  const ok = checked >= 1 && checked <= 2;
  form.querySelector('[name="source[]"]').setCustomValidity(ok ? '' : '请选择一至两项');
});

组校验挂在同组第一个控件上,提示浮层才会出现在正确位置。

「其他」选项怎么配

「其他」由独立字段承载文本内容,不与复选框本身共用一份数据:

<label><input type="checkbox" name="source[]" value="other"> 其他</label>
<input type="text" name="source_other" maxlength="40" disabled>

勾选时移除 disabled,取消勾选时清空并重新禁用。服务端遇到 value 为 other 时读取 source_other,两者一起做长度与字符校验。

检查清单

  • 同组 name 一致且带数组后缀;
  • 每项 value 非空、互不相同;
  • 服务端按数组取值并过白名单;
  • 个数限制走 setCustomValidity;
  • 「其他」内容字段独立且联动启用。

常见问题(FAQ)

复选框不加 value 属性会提交成什么?
提交值为字符串 on。同组多项都缺 value 时,服务端收到一串相同的值,无法区分用户勾了哪些项。
为什么服务端收不到未勾选的选项?
未勾选的复选框不参与表单提交,请求里不会出现对应参数。取值时应给默认值,并与白名单交集处理。
required 能实现「至少选择一项」吗?
不能。required 加在复选框上表示该控件自身必须勾选。整组的数量限制需使用 setCustomValidity 自行声明。
name 后面要不要写 []?
PHP 等后端依赖该约定把同名参数解析成数组。不写时同名参数会被覆盖,只保留最后一个值。框架或前端自管参数时可按需取舍。
label 包裹 input 和用 for 属性有什么区别?
两者都能建立关联。包裹写法不必维护 id,结构简单时用;控件与文字在 DOM 上距离较远时改用 for 加 id。
name属性value属性表单复选框表单提交问卷表单
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026鲁ICP备2025164830号-1