select multiple属性必须显式声明为<select multiple>才可靠生效,动态设置select.multiple=true无效;多选时需用selectedOptions获取全部选中项,移动端原生multiple不可靠,应改用checkbox组合或专用库。

select multiple 属性必须显式声明才生效
写成 <select multiple> 是唯一可靠方式,multiple="true" 或 multiple="" 在部分 Safari 和旧版 IE 中会被忽略。浏览器只检测属性是否存在,不解析它的值。动态用 JS 设置 select.multiple = true 也无效——DOM 已渲染,属性缺失就是缺失。
JS 获取选中项必须用 selectedOptions,别碰 value
select.value 在多选时永远只返回第一个选中项的 value 字符串,其余全丢。这是规范行为,不是 bug。正确做法是:
-
Array.from(select.selectedOptions).map(opt => opt.value)—— 现代浏览器标准写法 - IE11 兼容回退:
Array.from(select.options).filter(opt => opt.selected).map(opt => opt.value) - jQuery 用户注意:
$('select :selected').val()同样只返回第一个,得用$('select :selected').map((_, o) => o.value).get()
移动端根本不能依赖原生 multiple
iOS Safari 会彻底忽略 multiple 和 size,点击直接弹出单选 Picker;安卓 Chrome 表现也不稳定,长按可能无反馈、已选项无法取消。这不是配置问题,是 WebKit 和 Android WebView 的平台限制。
- 若业务需真正在手机端多选:改用
<input type="checkbox">组合 + CSS 折叠展开 - 或引入
tom-select、Choices.js这类库,它们根本不渲染原生select,而是接管 DOM - 若坚持用原生,至少在外层加提示文字:“PC 端按 Ctrl/Cmd 多选”,避免用户空点
限制最少/最多选中数量得靠 JS 校验
HTML 的 required 只能保证至少选 1 个,没法设“至少 2 个”或“最多 5 个”。必须手动监听 change 事件并检查 select.selectedOptions.length:
立即学习“前端免费学习笔记(深入)”;
- 禁止提交:
if (select.selectedOptions.length - 实时禁用多余选项:遍历
select.options,对超出上限的项设opt.disabled = true - 注意:不要监听
click或input,在 Safari 中可能不触发或只触发一次;必须绑定到select自身的change
selectedOptions 没问题,但没在真机上验证 iOS 行为——它连 selectedOptions 都不会更新,因为压根没进入多选模式。



















