multiple 属性必须显式声明且依赖 name 才能提交数据,name 缺失则表单不携带该字段;后端需按数组接收(如 Python 的 getlist);应直接写 multiple 而非 multiple="true";取值须用 selectedOptions 而非 value;iOS Safari 不支持原生 multiple,需自定义组件并添加 ARIA 属性;size="1" 会使 multiple 失效。

multiple 属性必须显式声明,且依赖 name 才能提交数据
加了 multiple 却收不到后端值?大概率漏了 name。原生 <select> 在没有 name 时,无论是否多选,表单提交都不会携带该字段。
-
name是必填项,否则GET/POST中完全不出现这个参数 - 后端接收方式不是单个字符串,而是数组:Python 用
request.form.getlist('tags'),PHP 用$_POST['tags'](它天然是 array) - 不要写
multiple="true"或multiple="multiple",直接写multiple即可——这是布尔属性,有即真
selectedOptions 是唯一可靠的取值方式,value 属性完全失效
select.value 在 multiple 模式下只返回第一个选中项或空字符串,不能用于判断或多选逻辑。必须用 selectedOptions。
-
selectedOptions是实时 HTMLCollection,遍历时可用扩展运算符转数组:[...select.selectedOptions].map(o => o.value) - 若需文字内容,用
o.text;判断是否无选中项,检查select.selectedOptions.length === 0 - 别手动遍历
options并查option.selected——虽然可行,但冗余且易错
移动端 Safari 基本不支持 multiple,别在 iOS 上指望原生体验
iOS 系统级限制导致 <select multiple> 在 Safari 中会退化为单选 Picker,长按、Ctrl/Cmd 都无效。这不是样式问题,是 WebKit 的硬性限制。
- 桌面端管理后台可放心用,但面向公众的响应式页面建议绕过原生控件
- 如需“点击展开→勾选→收起”流程,必须用自定义组件:隐藏原生
<select multiple>,用<div>+<input type="checkbox">模拟 UI,并同步状态 - 自定义实现时,务必加
role="listbox"和aria-selected,否则屏幕阅读器无法识别多选状态
size 属性控制可见行数,但设为 1 会让 multiple 失效
size 决定下拉框默认展示几行选项,但它和 multiple 是协同关系,不是装饰属性。
立即学习“前端免费学习笔记(深入)”;
-
size="4"表示默认显示 4 行,用户无需滚动就能看到部分选项;不设则浏览器按约 4 行渲染 -
size="1"会强制退化为单选模式,multiple被忽略——这点极易被忽略,调试时发现多选失效,先看 size - 想让它“看起来像下拉”,不能靠
size="1",得用 JS 控制显隐,或者直接换自定义方案
multiple 最容易被低估的是语义与行为绑定:它天生就是“展开列表”,不是“可下拉的多选器”。要不要用它,关键看场景——后台管理员能接受键盘操作就用;面向大众、尤其含 iOS 用户,就得准备 fallback。



















