前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库HTML select multiple value property selectedOptions
HTML表单与输入

多选 select 怎么拿到所有选中的值?

select.value 永远只返回第一个选中项的值,多选场景下要用 selectedOptions 拿到所有被选中的 <option>,再逐个读 value。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#表单与输入#表单
先看核心答案读代码示例
理解线索

多选取值的三个层面

  1. DOM 属性value 只给第一个,selectedOptions 给全部
  2. 表单提交每个选中项都以同名键值对发送
  3. JavaScript 读取用 FormData.getAll(name) 一步到位

selectedOptions 是实时的 HTMLCollection,选中状态变了它会自动更新,不需要重新获取。

核心回答

先记住这个答案

<select multiple> 的 value 属性在 DOM 里只返回第一个被选中的 <option> 的值。如果没有选中任何项,value 是空字符串。想拿到所有选中项,要用 select.selectedOptions,它返回一个包含所有选中 <option> 元素的 HTMLCollection。

  • value 只返回第一个选中项
  • selectedOptions 返回全部选中项集合
  • 表单提交时同名字段会发送多次
  • FormData.getAll() 一次取回数组

用代码看清楚 value 和 selectedOptions 的区别

假设一个多选列表里选中了「苹果」和「香蕉」两项,直觉上 value 应该返回两个值,但实际只有一个。

读取多选值的正确方式HTML
<form id="fruit-form">
<select id="fruits" multiple name="fruit">
  <option value="apple" selected>苹果</option>
  <option value="banana" selected>香蕉</option>
  <option value="cherry">樱桃</option>
</select>
</form>

<script>
  const sel = document.getElementById('fruits')
  // 只拿到第一个选中项
  console.log(sel.value) // "apple"
  // 拿到全部选中项
  const vals = Array.from(sel.selectedOptions, option => option.value)
  console.log(vals) // ["apple", "banana"]
</script>

selectedOptions 是只读的实时集合。用户改了选择,集合会自动更新,不需要手动刷新。 另一种老写法是遍历 select.options,逐个检查 option.selected 是否为 true。效果一样,但代码更长。

表单提交时多选值怎么发送

用表单直接提交时,每个选中项都会作为独立的键值对发送。比如选了苹果和香蕉,请求体里会出现 fruit=apple&fruit=banana,同一个 name 出现两次。

用 FormData 取回数组JavaScript
const form = document.querySelector('#fruit-form')
const data = new FormData(form)
// get() 只返回第一个值
console.log(data.get('fruit'))    // "apple"
// getAll() 返回全部值的数组
console.log(data.getAll('fruit')) // ["apple", "banana"]

后端如何解析重复的 fruit 键取决于框架和配置,不能假定一定合并成数组。前后端应约定“一个键可出现多次”,在前端用 FormData 预处理时则用 getAll(),否则 get() 只能拿到第一个。 在筛选器里做“标签多选”时,先约定无选中项代表什么:有些接口把缺少 fruit 键解释成“不过滤”,有些解释成“空结果”。原生提交在没有选项被选中时不会凭空发送一个空数组,前端若要表达“用户明确清空选择”,需要和后端约定额外字段或请求结构。脚本读取时,selectedOptions 的顺序通常按选项在 DOM 中的顺序,而不是用户点击先后;若业务需要点击顺序,要另行记录。 selectedOptions 是实时集合,保留它的引用后,用户选择一变,集合内容也跟着变。若代码要比较“提交前”和“提交后”两次选择,应该在各时点把值复制成数组,而不是保存同一个集合对象。select.value 在没有选中项时返回空字符串,这和“选中了一个值恰好为空字符串的选项”容易混淆;要判断是否真有选中项,查看 selectedOptions.length。

回答前,多想一步

容易答错的地方

以为 value 能返回多个值
这是最常见的误解。不管选了几项,value 永远只有一个字符串。多选列表的 value 和单选列表行为完全一样,只看第一个选中的 <option>。
忘了 selectedOptions 是 HTMLCollection 不是数组
selectedOptions 没有 map、filter 这些数组方法。要当数组用需要先转换,用 Array.from() 或展开运算符 [...sel.selectedOptions]。
试着用自己的话回答

面试官还会怎么问?

如果一个选项都没选,value 返回什么?

返回空字符串 ""。selectedOptions 返回一个长度为 0 的空集合。

用 JavaScript 怎么设置多个选中项?

不能通过给 value 赋值来选多项。要遍历 select.options,把目标项的 selected 设为 true。比如 select.options[1].selected = true。

React 里怎么处理多选 <select>?

React 的 <select multiple> 通过 value 属性接受一个数组,比如 value={['apple', 'banana']}。onChange 事件里同样要从 e.target.selectedOptions 读取所有选中值,和原生 DOM 的方式一样。

从一道题,走向一组知识

把知识连起来

表单与输入

select 的 size 大于 1,就能同时选多个吗?

size 属性决定了多选 <select> 默认展示几行,直接影响多选的交互体验。

表单与输入

表单里的 tabindex 怎么改变 Tab 键顺序?

原生 <select> 默认可按顺序获得焦点;调整 tabindex 时要避免让多选列表的键盘访问顺序变乱。

参考资料

  • HTML:表单与输入参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 用代码看清楚 value 和 selectedOptions 的区别
  3. 表单提交时多选值怎么发送
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑