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

IT技术 javascript jquery html
2021-01-13 13:34:08

似乎很奇怪我找不到这个已经问过的人,但它来了!

我有一个 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>

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

例如,如果用户选择了 Lunch 和 Snacks,我想要一个 { 2, 4 } 的数组。

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

谢谢。

6个回答

除非问题要求使用 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;
}
最后!香草……我最喜欢的味道
2021-03-17 13:34:08
哈,没看到:/仍然+1
2021-03-19 13:34:08
请注意,当没有value属性时,则opt.value= opt.text
2021-03-25 13:34:08
它被标记为 jquery。
2021-04-07 13:34:08
怎么样selectedOptions跨浏览器还不够吗?Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
2021-04-13 13:34:08

通常的方法:

var values = $('#select-meal-type').val();

文档

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

实际上,我发现使用纯 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; 
});

更新(2017-02-14):

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

const selected = document.querySelectorAll('#select-meal-type option:checked');
const values = Array.from(selected).map(el => el.value);
仅供参考,使用 selectedOptions/options 集合比使用 querySelectorAll 更快。
2021-03-15 13:34:08
谢谢@AdamLeggett。供不知道的人参考,这会将上面的@Someguynamedpie 代码更改为:Array.from(element.selectedOptions).map(v=>v.value);
2021-03-17 13:34:08
它会,但请参阅下面的答案 - 它在 IE 上根本不起作用,并且在某些旧版本的 Chrome 和 Firefox 中具有奇怪的行为。如果您不关心性能,querySelectorAll 或过滤 element.options 确实可以完成工作。此外,您可以执行 [].map.call() 而不是使用 Array.from(),我不知道这会对性能产生什么影响,但肯定不会是负面的。
2021-03-20 13:34:08
usedchecked 这对我有用,在多选下拉菜单上,但也适用于所有下拉菜单$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
2021-03-23 13:34:08
或者,如果您有元素: Array.from(element.querySelectorAll("option:checked"),e=>e.value);
2021-04-07 13:34:08

如果你想走现代之路,你可以这样做:

const selectedOpts = [...field.options].filter(x => x.selected);

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

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

const selectedValues = [...field.options]
                     .filter(x => x.selected)
                     .map(x => x.value);
这个答案值得更多的信任。完美解决,谢谢!
2021-03-31 13:34:08
这是一个很棒的解决方案
2021-04-05 13:34:08
我认为这是今天最好的答案。顺便说一句,您不需要 x 周围的括号。
2021-04-10 13:34:08

你可以使用selectedOptions财产

var options = document.getElementById('select-meal-type').selectedOptions;
var values = Array.from(options).map(({ value }) => value);
console.log(values);
<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>

一个原生的、简单的、非 jQuery 的答案。谢谢你。
2021-04-02 13:34:08