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


115

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

我有一个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中选择的所有值(数组?)?

例如,如果用户选择了“午餐和零食”,则我需要一个{2,4}的数组。

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

谢谢。




Answers:


104

通常的方式:

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

文档

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


10
@augurone:我声称是吗?
Felix Kling 2015年

9
@FelixKling您只是误导了一个可能会为此而直接包括整个jQuery库的人,直到他意识到除非真正需要,否则他不应该这样做。
Aamir Afridi

32
@AamirAfridi:问题是用jQuery标记的。用库标记问题通常意味着操作员使用该库,并且欢迎使用该库的答案。我是否还会建议Ina立即使用jQuery?也许。但是这个问题已经超过3年了。另请参见OP对对方的回答评论:stackoverflow.com/questions/11821261/...
费利克斯·克林

12
你是对的。如果问题用jQuery tagged标记,这是有道理的
Aamir Afridi

148

除非一个问题要求使用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;
}

24
用jquery标记。
凯尔(Kyle)2015年

1
哈,没看到:/还是+1
mw_21

6
selectedOptions呢 跨浏览器不够吗?Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits 2015年

请注意,如果没有value属性,则opt.value= opt.text
thdoan '18

1
最后!香草...我最喜欢的味道
papiro

46

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

7
或者,如果您具有以下元素:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie 18'Apr

1
仅供参考,使用selectedOptions / options集合比使用querySelectorAll更快。
亚当·莱格特

4
谢谢@AdamLeggett。供不认识的人参考,这会将@Someguynamedpie的上面的代码更改为Array.from(element.selectedOptions).map(v=>v.value);
KyleFarris

可以,但是请在下面查看我的答案-它根本无法在IE上运行,并且在某些较旧版本的Chrome和Firefox中具有奇怪的行为。如果您不关心性能,则querySelectorAll或filter element.options确实可以完成工作。另外,您可以执行[] .map.call()而不是使用Array.from(),我不知道这会对性能产生什么影响,但肯定不会带来负面影响。
亚当·莱格特

用过的checked 这个功能对我来说很有效,可以选择多个下拉菜单,但也应该适用于所有下拉菜单$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

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

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

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

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

const selectedValues = [...field.options]
                     .filter((x) => x.selected)
                     .map((x)=>x.value);

这个答案值得更多的赞誉。完美的解决方案,谢谢!
Silver Ringvee

10

首先,使用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

9

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

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


5

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>

4

试试这个:

$('#select-meal-type').change(function(){
    var arr = $(this).val()
});

演示版

$('#select-meal-type').change(function(){
  var arr = $(this).val();
  console.log(arr)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<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>

小提琴


3

如果您想按每个值后面的分隔符表示;

$('#select-meal-type').change(function(){
    var meals = $(this).val();
    var selectedmeals = meals.join(", "); // there is a break after comma

    alert (selectedmeals); // just for testing what will be printed
})

2

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

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

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


1
不幸的是,这不会在所有地方都有效,事实证明IE11没有字段selectedOptions。但是,以下方法确实有效:Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

0

我将选择以下内容:

let selectElement = document.getElementById('categorySelect');
let selectedOptions = selectedElement.selectedOptions || [].filter.call(selectedElement.options, option => option.selected);
let selectedValues = [].map.call(selectedOptions, option => option.value);

简而言之,它在现代浏览器上运行很快,我们不在乎是否在1%市场份额的浏览器上运行很快。

请注意,selectedOptions在大约5年前的某些浏览器中具有不正常的行为,因此此处的用户代理嗅探并非完全不合时宜。


-1

无需jQuery即可在任何地方工作:

var getSelectValues = function (select) {
    var ret = [];

    // fast but not universally supported
    if (select.selectedOptions != undefined) {
        for (var i=0; i < select.selectedOptions.length; i++) {
            ret.push(select.selectedOptions[i].value);
        }

    // compatible, but can be painfully slow
    } else {
        for (var i=0; i < select.options.length; i++) {
            if (select.options[i].selected) {
                ret.push(select.options[i].value);
            }
        }
    }
    return ret;
};

selectedOptiongsIE不支持
Dustin Poissant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.