select标签需添加multiple属性才支持多选,否则默认单选;必须用selectedOptions获取全部选中值,value仅返回首个;name和option的value属性决定表单提交内容;需兼顾可访问性与跨浏览器兼容性。

select标签加multiple属性才能多选
不加 multiple 属性时,select 默认是单选;只有显式加上这个布尔属性,用户才能按住 Ctrl(Windows/Linux)或 Cmd(macOS)点选多个选项,或者拖拽选择连续项。
常见错误是只写 却忘了加 multiple,结果界面看起来像多选,但实际只能选一个。
-
multiple是布尔属性,写multiple="multiple"或简写multiple都可以,推荐简写 - 浏览器不会自动显示滚动条或高度限制,需用 CSS 设置
size属性(如size="4")来控制可见行数,否则默认只显示一行,用户看不到“多选感” - 移动端 Safari 对
multiple支持有限:iOS 15.4 之前会降级为单选弹窗,iOS 15.4+ 才原生支持多选下拉(但仍建议测试真机)
获取多选的值要用JavaScript遍历selectedOptions
提交表单时,select[multiple] 的多个选中值会以同名字段多次提交(如 hobby=reading&hobby=coding),但 JS 获取时不能直接读 value——它只返回第一个选中项的值。
必须用 selectedOptions 集合遍历,或手动检查每个 option.selected 状态。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
const select = document.getElementById('hobbies');
const values = Array.from(select.selectedOptions).map(opt => opt.value);
// 得到 ['reading', 'coding']
- 别用
select.value,它不可靠 -
select.options是所有option元素,select.selectedOptions是当前被选中的(IE11+、现代浏览器都支持) - 如果用 jQuery,
$('select[multiple] :selected').val()返回的是第一个值,得用.map().get()才能拿到全部
name属性决定后端接收的字段名,value必须有值
后端(比如 PHP 的 $_POST['hobbies']、Python Flask 的 request.form.getlist('hobbies'))靠 name 区分字段。没有 name 的 select 不会随表单提交。
- 每个
option必须有value属性,否则提交时该选项值为空字符串(不是跳过) - 空
value(如)也会被提交,后端可能收到空字符串,需校验 - 若用
分组,它本身不参与值提交,只影响视觉和键盘导航
可访问性与用户体验细节容易被忽略
屏幕阅读器依赖 label 和 aria-label 理解多选意图,纯靠视觉提示(比如“按住 Ctrl 多选”文字)对残障用户无效。
- 必须配
或把select包在label内 - 加
aria-label="请选择您的兴趣爱好(可多选)"明确说明行为 - 不要依赖
title提示操作方式,它在移动端不一致,且很多辅助工具不读title - 如果选项超过 10 个,考虑改用带搜索的组件(如 Select2、Choices.js),原生
select[multiple]在长列表里体验很差
真正麻烦的不是写法,而是跨浏览器行为差异和辅助技术适配——比如 Firefox 会把 multiple 的 select 当作“列表框”朗读,而 Chrome 可能读作“组合框”,这会影响用户预期。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










