如何从<select multiple = multiple>中获取所有选定的值?

Kyl*_*yle 84 html javascript jquery

看起来很奇怪我找不到已经问过的这个,但是在这里它!

我有一个HTML如下:

<select id="select-meal-type" multiple="multiple">
    <option value="1">Breakfast</option>
    <option value="2">Lunch</option>
    <option value="3">Dinner</option>
    <option value="4">Snacks</option>
    <option value="5">Dessert</option>
</select>
Run Code Online (Sandbox Code Playgroud)

如何获取用户在javascript中选择的所有值(数组?)?

例如,如果用户选择了午餐和小吃,我想要一个{2,4}的数组.

这似乎应该是一个非常简单的任务,但我似乎无法做到这一点.

谢谢.

lvo*_*elk 123

除非问题要求JQuery,否则应该首先在标准javascript中回答问题,因为许多人不在他们的网站中使用JQuery.

来自RobG 如何使用JavaScript获取多选框的所有选定值?:

  function getSelectValues(select) {
  var result = [];
  var options = select && select.options;
  var opt;

  for (var i=0, iLen=options.length; i<iLen; i++) {
    opt = options[i];

    if (opt.selected) {
      result.push(opt.value || opt.text);
    }
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 它用jquery标记. (21认同)
  • 那么`selectedOptions`怎么样?这不是跨浏览器吗?`Array.prototype.map.call(el.selectedOptions,function(x){return x.value})` (5认同)
  • selectedOptions在IE中不起作用 (4认同)
  • 哈,没看到:/仍然+1 (2认同)
  • 最后!香草……我最喜欢的味道 (2认同)

Fel*_*ing 78

通常的方式:

var values = $('#select-meal-type').val();
Run Code Online (Sandbox Code Playgroud)

来自文档:

<select multiple="multiple">元素的情况下,该.val()方法返回包含每个所选选项的数组;

  • @AamirAfridi:问题用jQuery标记.使用库标记问题通常意味着操作系统使用该库,并且欢迎使用该库的答案.我今天还会建议另一种方式Ina门到jQuery吗?也许.但这个问题已经超过3年了.另请参阅OP对其他答案的评论:http://stackoverflow.com/questions/11821261/how-to-get-all-selected-values-from-select-multiple-multiple/27781069#comment43987809_27781069 (25认同)
  • 你是对的.如果用jQuery标记问题,这是有道理的 (11认同)
  • @augurone:我声称是吗? (10认同)
  • @FelixKling你只是误导了一个可能直接包含整个jQuery lib的人,直到他意识到除非他真的需要,否则他不应该这样做. (7认同)

Kyl*_*ris 36

实际上,我发现使用纯JavaScript的最佳,最简洁,最快速和最兼容的方式(假设您不需要完全支持IE lte 8)如下:

var values = Array.prototype.slice.call(document.querySelectorAll('#select-meal-type option:checked'),0).map(function(v,i,a) { 
    return v.value; 
});
Run Code Online (Sandbox Code Playgroud)

更新(2017-02-14):

使用ES6/ES2015(对于支持它的浏览器)更简洁的方式:

const selected = document.querySelectorAll('#select-meal-type option:checked');
const values = Array.from(selected).map(el => el.value);
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果你有元素:```Array.from(element.querySelectorAll("option:checked"),e => e.value);``` (4认同)
  • 仅供参考,使用 selectedOptions/options 集合比使用 querySelectorAll 更快。 (2认同)
  • 谢谢@AdamLeggett。为了向不知道的人提供参考,可以将@Someguynamedpie的上面的代码更改为:Array.from(element.selectedOptions).map(v =&gt; v.value);。 (2认同)

Tan*_*ith 21

你可以使用selectedOptions财产

var options = document.getElementById('select-meal-type').selectedOptions;
var values = Array.from(options).map(({ value }) => value);
console.log(values);
Run Code Online (Sandbox Code Playgroud)
<select id="select-meal-type" multiple="multiple">
    <option value="1">Breakfast</option>
    <option value="2" selected>Lunch</option>
    <option value="3">Dinner</option>
    <option value="4" selected>Snacks</option>
    <option value="5">Dessert</option>
</select>
Run Code Online (Sandbox Code Playgroud)

  • 一个原生的、简单的、非 jQuery 的答案。谢谢。 (7认同)

Joh*_*nde 9

$('#select-meal-type :selected') 将包含所有选定项目的数组.

$('#select-meal-type option:selected').each(function() {
    alert($(this).val());
});
Run Code Online (Sandbox Code Playgroud)


小智 7

首先,用于Array.fromHTMLCollection对象转换为数组.

let selectElement = document.getElementById('categorySelect')
let selectedValues = Array.from(selectElement.selectedOptions)
        .map(option => option.value) // make sure you know what '.map' does

// you could also do: selectElement.options
Run Code Online (Sandbox Code Playgroud)


Tom*_*ica 6

如果您想采用现代方式,可以执行以下操作:

const selectedOpts = [...field.options].filter((x) => x.selected);
Run Code Online (Sandbox Code Playgroud)

...操作者可迭代映射(HTMLOptionsCollection)到阵列。

如果您只对值感兴趣,可以添加一个map()调用:

const selectedValues = [...field.options]
                     .filter((x) => x.selected)
                     .map((x)=>x.value);
Run Code Online (Sandbox Code Playgroud)


Fer*_*gie 6

2019 年 10 月更新

以下应该在所有现代浏览器上“独立”工作,没有任何依赖或转译。

<!-- display a pop-up with the selected values from the <select> element -->

<script>
 const showSelectedOptions = options => alert(
   [...options].filter(o => o.selected).map(o => o.value)
 )
</script>

<select multiple onchange="showSelectedOptions(this.options)">
  <option value='1'>one</option>
  <option value='2'>two</option>
  <option value='3'>three</option>
  <option value='4'>four</option>
</select>
Run Code Online (Sandbox Code Playgroud)


adl*_*lr0 5

如果您需要响应更改,可以尝试以下操作:

document.getElementById('select-meal-type').addEventListener('change', function(e) {
    let values = [].slice.call(e.target.selectedOptions).map(a => a.value));
})
Run Code Online (Sandbox Code Playgroud)

[].slice.call(e.target.selectedOptions)是必要的,因为e.target.selectedOptions回报HTMLCollection,而不是一个Array。该调用将其转换为 ,Array以便我们可以应用map提取值的函数。