<select multiple> 默认需配合 Ctrl/Shift 多选,要实现点击即切换需监听 click 事件并手动管理 selected 状态;其 value 属性只返回首个选中项,获取全部须用 selectedOptions;iOS Safari 不支持原生多选,应降级为 ARIA 模拟组件。
<select multiple> 真正支持多选操作默认情况下,<select multiple> 只是开启多选 UI,但用户必须配合 Ctrl(macOS 是 ⌘)或 Shift 才能连续选中多个选项——这和多数现代交互预期不符。要实现点击即切换、无需修饰键的“类复选框”行为,必须靠 JavaScript 干预。
click 事件(不是 change),因为 change 在失去焦点时才触发,无法实时响应单次点击event.target.selectedOptions 或遍历 options 数组判断 selected 状态option.selected 赋值会触发重排,频繁操作建议批量修改后统一提交select[multiple] 的 value 属性只返回第一个选中项<select multiple> 的 value 属性是只读的,且规范规定它始终返回第一个 selected 的 <option> 的 value,哪怕你选了十个。这不是 bug,是 DOM 标准行为。
Array.from(select.selectedOptions).map(opt => opt.value)
<option> 没设 value 属性,其值为 textContent,注意空格和换行可能混入name=tags[] 或 JSON body),而非单个字符串multiple 的兼容性陷阱iOS Safari 对原生 <select multiple> 支持极差:点击后弹出的是单选式全屏选择器,且不显示已选项状态,用户根本无法确认多选结果。
multiple 实际不可用,应检测 navigator.userAgent.includes('iPhone') 或使用 @supports (-webkit-appearance: none) 做降级<div role="listbox"> + <button role="option"> 模拟,配合 ARIA 属性(aria-selected、aria-multiselectable)保证可访问性select,至少加 size="5" 让选项可见,避免纯下拉触发 Safari 的错误弹窗multiple 选中的数据怎么被后端正确解析浏览器提交时,<select name="colors" multiple> 会把每个选中项作为独立字段发送,例如:colors=red&colors=blue&colors=green。但不同后端框架处理方式差异极大。
立即学习“前端免费学习笔记(深入)”;
$_GET['colors'] 只得 green),必须用 colors[]=red&colors[]=blue 格式,即 name="colors[]"
urlencoded 中间件(如 express.urlencoded)默认支持数组,但需设置 extended: true
new FormData(form).getAll('colors') 或 JSON.stringify(selectedValues)