multiple属性必须显式写在select标签中才生效,浏览器仅检测其存在与否;需配合size属性(如size="4")使多选可见;取值须用selectedOptions而非value;iOS Safari中该属性基本无效。

multiple 属性必须显式写在 select 标签里才生效
浏览器只认 HTML 中是否存在 multiple 这个属性,不解析它的值,也不响应 JS 赋值。写 select.multiple = true 或 select.setAttribute('multiple', 'true') 都不能替代原生 HTML 属性。
-
<select multiple>✅ 唯一推荐写法,简洁、标准、兼容性好 -
<select multiple="multiple">⚠️ 合法但冗余,仅需兼容极老 XHTML 场景 -
<select multiple="true">❌ 多数现代浏览器能容错,但 Safari 旧版、IE 可能直接忽略 -
<select multiple="">❌ XHTML 不允许空属性值,部分解析器报错
不设 size 就等于隐藏多选能力
默认情况下 <select multiple> 渲染为单行滚动框(高度约 22px),视觉上和单选下拉几乎一样,用户根本看不出能多选,更不会主动按 Ctrl/Cmd。
-
size="4"是较稳妥的起点:显示 4 行选项,用户一眼识别为列表框 -
size值必须小于总<option>数才有滚动效果;设成size="100"会撑开布局,破坏流式结构 -
size="1"在部分浏览器中仍显示为单行带滚动箭头,行为是多选,但交互暗示依然薄弱
JS 取值必须用 selectedOptions,别碰 value
select.value 永远只返回第一个选中项的 value 字符串,哪怕你选了 10 个,它也只吐出第一个——这不是 bug,是规范行为。
- 正确取法:
Array.from(select.selectedOptions).map(opt => opt.value) - IE11 不支持
selectedOptions,需回退:Array.from(select.options).filter(opt => opt.selected).map(opt => opt.value) - jQuery 的
$('select :selected').val()同样只返回第一个,要用$('select :selected').map((_, o) => o.value).get() - 动态增删
<option>后,selectedOptions自动更新,无需手动同步状态
iOS Safari 上 multiple 基本无效,这不是配置问题
无论你怎么写 multiple、设多少 size、加多少提示文字,在 iOS Safari 点击时都会弹出单选弹窗,且无法通过长按、双指等手势触发多选——这是 WebKit 的平台限制,不是代码缺陷。
立即学习“前端免费学习笔记(深入)”;
- 不要在移动端核心流程中依赖原生
<select multiple> - 需要稳定多选体验时,改用
<input type="checkbox">组合 + CSS 折叠展开,或引入 tom-select、Choices.js 等库(它们根本不渲染select) - 若坚持用原生,至少在外层加明确提示:
<p>PC 端按 Ctrl/Cmd 多选;移动端请使用下方复选框</p>


















