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

时间:2012-08-06 00:17:12

标签: javascript jquery html

看起来很奇怪我找不到这个问题了,但是现在好了!

我有一个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}的数组。

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

感谢。

15 个答案:

答案 0 :(得分:106)

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

来自RobG How to get all selected values of a multiple select box using 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;
}

答案 1 :(得分:71)

通常的方式:

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

来自docs

  

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

答案 2 :(得分:26)

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:6)

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

答案 5 :(得分: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>

fiddle

答案 6 :(得分: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
})

答案 7 :(得分:3)

您可以使用selectedOptions

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

答案 8 :(得分: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函数来提取值。

答案 9 :(得分:2)

如果您想采用现代方式,可以这样做:

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

...运算符将可迭代(HTMLOptionsCollection)映射到数组。

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

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

答案 10 :(得分:1)

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>

答案 11 :(得分:0)

在没有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;
};

答案 12 :(得分: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%的市场份额浏览器中是否运行迅速。

请注意,从大约5年前开始,selectedOptions在某些浏览器上就出现了奇怪的行为,因此此处的用户代理嗅探并非完全不合时宜。

答案 13 :(得分:0)

$('#application_student_groups option:selected').toArray().map(item => item.value)

答案 14 :(得分:0)

如果您有多个带有 multiple='multiple' 的选择框,并且您想从每个下拉列表中选择所有选定的选项,请使用此选项 HTML:

<select id='Alphabets'>
    <option value="1">A</option>
    <option value="2">B</option>
    <option value="3">C</option>
</select>

<select id='Alphabets' multiple='multiple'>
    <option value="4">D</option>
    <option value="5">E</option>
    <option value="6">F</option>
</select>
<select id='Alphabets'>
    <option value="7">G</option>
    <option value="8">H</option>
    <option value="9">I</option>
</select>
<select id='Alphabets' multiple='multiple'>
    <option value="10">J</option>
    <option value="11">K</option>
    <option value="12">L</option>
</select>

上述 UI 的 JavaScript:

function show_Alphebets()
{
        var tag =document.querySelectorAll("select");        
        var values="";
        for(var i=1; i<4; i++) {
            if(tag[i].options.length>0)
            for (var option of tag[i].selectedOptions) {                  
                  values+= i+"(multiple)="+option.value+",";
            }
            else values+= i+"="+tag[i].value+",";
        }
        alert(values);
}