2012-08-06 40 views
38

看起来很奇怪,我找不到这个已经问过的问题,但是它在这里!如何从<select multiple = multiple>中获取所有选定的值?

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

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

谢谢。

+1

的[获取在选择多个选项值]可能重复(http://stackoverflow.com/questions/1749082/get-values-from-multiple-selections-在选择) – 2012-08-06 00:58:26

+0

可能的重复[如何使用jQuery获取多个选择框值?](http://stackoverflow.com/questions/3243476/how-to-get-multiple-select-box-values-using-jquery ) – 2014-04-22 11:58:55

+0

[如何使用JavaScript获取多选框的所有选定值?](http://stackoverflow.com/questions/5866169/how-to-get-all-selected-values-of-a-多个选择框使用javascript) – jtheletter 2017-01-26 00:41:33

回答

44

的常用方法:

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

docs

<select multiple="multiple">元件的情况下,所述.val()方法返回包含每个选择的选项的阵列;

+37

jQuery不是所有事情的答案。 – augurone 2015-08-24 16:09:55

+7

@augurone:我声称它是? – 2015-08-24 16:11:09

+3

@FelixKling你只是误导了一个人,他可能会马上为整个jQuery库包含整个jQuery库,然后他才意识到他不应该这样做,除非他真的需要。 – 2016-02-25 20:33:37

7

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

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

+1

这回答了实际的任务标题中的离子。 – 2012-12-26 11:00:15

2

试试这个:

$('#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

3

如果你想要你在每个值之后用break来表示;

$('#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 
}) 
66

除非问题要求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; 
} 
+9

它的标签为jquery。 – Kyle 2015-01-05 22:20:57

+1

公顷,没有看到:/ still +1 – 2015-02-01 19:10:39

+4

'selectedOptions'呢?它不够跨浏览器吗? 'Array.prototype.map.call(el.selectedOptions,function(x){return x.value})' – tenbits 2015-07-08 13:56:31

16

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

UPDATE(2017年2月14日):

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

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

如果需要对变化做出反应,你可以试试这个:

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函数。

+0

不幸的是,这不会在任何地方工作,事实证明IE11没有字段selectedOptions 。然而,以下方法仍然有效:'Array.prototype.slice.call(field.querySelectorAll(':checked'))' – JamesDev 2017-07-17 09:53:52

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; 
}; 
相关问题