如何获取多选框的所有选定值?

时间:2011-05-03 07:01:01

标签: javascript html drop-down-menu

我有一个<select>元素,其multiple属性。如何使用JavaScript获取此元素的选定值?

以下是我正在尝试的内容:

function loopSelected() { 
    var txtSelectedValuesObj = document.getElementById('txtSelectedValues');
    var selectedArray = new Array();
    var selObj = document.getElementById('slct'); 
    var i;
    var count = 0;
    for (i=0; i<selObj.options.length; i++) { 
        if (selObj.options[i].selected) {
            selectedArray[count] = selObj.options[i].value;
            count++; 
        } 
    } 
    txtSelectedValuesObj.value = selectedArray;
}

16 个答案:

答案 0 :(得分:90)

没有jQuery:

// Return an array of the selected opion values
// select is an HTML select element
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;
}

快速举例:

<select multiple>
  <option>opt 1 text
  <option value="opt 2 value">opt 2 text
</select>
<button onclick="
  var el = document.getElementsByTagName('select')[0];
  alert(getSelectValues(el));
">Show selected values</button>

答案 1 :(得分:28)

签出:

<强> HTML:

<a id="aSelect" href="#">Select</a>
<br />
<asp:ListBox ID="lstSelect" runat="server"  SelectionMode="Multiple" Width="100px">
    <asp:ListItem Text="Raj" Value="1"></asp:ListItem>
    <asp:ListItem Text="Karan" Value="2"></asp:ListItem>
    <asp:ListItem Text="Riya" Value="3"></asp:ListItem>
    <asp:ListItem Text="Aman" Value="4"></asp:ListItem>
    <asp:ListItem Text="Tom" Value="5"></asp:ListItem>
</asp:ListBox>

<强> JQUERY:

$("#aSelect").click(function(){
    var selectedValues = [];    
    $("#lstSelect :selected").each(function(){
        selectedValues.push($(this).val()); 
    });
    alert(selectedValues);
    return false;
});

<强> CLICK HERE TO SEE THE DEMO

答案 2 :(得分:23)

<强> ES6

[...select.options].filter(option => option.selected).map(option => option.value)

其中select是对<select>元素的引用。

要打破它:

  • [...select.options]获取类似Array的选项列表并对其进行解构,以便我们可以在其上使用Array.prototype方法(编辑:也考虑使用Array.from()
  • filter(...)会将选项缩小为仅选定的选项
  • map(...)将原始<option>元素转换为各自的值

答案 3 :(得分:10)

与已经提出的相同,但有点不同。与Vanilla JS中的jQuery一样多的代码:

selected = Array.prototype.filter.apply(
  select.options, [
    function(o) {
      return o.selected;
    }
  ]
);

seems to be faster而不是IE,FF和Safari中的循环。我觉得有趣的是它在Chrome和Opera中速度较慢。

另一种方法是使用选择器:

selected = Array.prototype.map.apply(
    select.querySelectorAll('option[selected="selected"]'),
    [function (o) { return o.value; }]
);

答案 4 :(得分:8)

假设multiSelect是Multiple-Select-Element,只需使用其selectedOptions属性:

//show all selected options in the console:

for ( var i = 0; i < multiSelect.selectedOptions.length; i++) {
  console.log( multiSelect.selectedOptions[i].value);
}

答案 5 :(得分:3)

这是 ES6 实施:

value = Array(...el.options).reduce((acc, option) => {
  if (option.selected === true) {
    acc.push(option.value);
  }
  return acc;
}, []);

答案 6 :(得分:2)

您可以尝试此脚本

     <!DOCTYPE html>
    <html>
    <script>
    function getMultipleSelectedValue()
    {
      var x=document.getElementById("alpha");
      for (var i = 0; i < x.options.length; i++) {
         if(x.options[i].selected ==true){
              alert(x.options[i].value);
          }
      }
    }
    </script>
    </head>
    <body>
    <select multiple="multiple" id="alpha">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
      <option value="d">D</option>
    </select>
    <input type="button" value="Submit" onclick="getMultipleSelectedValue()"/>
    </body>
    </html>

答案 7 :(得分:2)

您可以使用[].reduce来更紧凑地实施RobG's approach

var getSelectedValues =  function(selectElement) {
  return [].reduce.call(selectElement.options, function(result, option) {
    if (option.selected) result.push(option.value);
    return result;
  }, []);
};

答案 8 :(得分:1)

与之前的答案相同,但使用了underscore.js。

function getSelectValues(select) {
    return _.map(_.filter(select.options, function(opt) { 
        return opt.selected; }), function(opt) { 
            return opt.value || opt.text; });
}

答案 9 :(得分:1)

我的模板帮助器如下所示:

 'submit #update': function(event) {
    event.preventDefault();
    var obj_opts = event.target.tags.selectedOptions; //returns HTMLCollection
    var array_opts = Object.values(obj_opts);  //convert to array
    var stray = array_opts.map((o)=> o.text ); //to filter your bits: text, value or selected
    //do stuff
}

答案 10 :(得分:1)

Rick Viscomi的答案为基础,尝试使用HTML Select元素的selectedOptions属性:

let txtSelectedValuesObj = document.getElementById('txtSelectedValues');
[...txtSelectedValuesObj.selectedOptions].map(option => option.value);

详细

  • selectedOptions返回所选项目的列表。
  • 具体来说,它返回包含HTMLCollection的只读HTMLOptionElements
  • ...spread syntax。它扩展了HTMLCollection的元素。
  • [...]从这些元素创建一个可变的Array对象,为您提供HTMLOptionElements的数组。
  • map()用其valueHTMLObjectElement)替换数组中的每个option(此处称为option.value)。

密集,但似乎可行。

请注意,selectedOptions isn't supported是IE浏览器!

答案 11 :(得分:1)

检查此内容:

HTML:

<select id="test" multiple>
<option value="red" selected>Red</option>
<option value="rock" selected>Rock</option>
<option value="sun">Sun</option>
</select>

JavaScript一行代码

Array.from(document.getElementById("test").options).filter(option => option.selected).map(option => option.value);

答案 12 :(得分:0)

Riot js code

A R R R R R G G G G G B B B B B           <--- what IM saw
R R R R G G G G B B B B A A A A           <--- what it really meant

答案 13 :(得分:0)

您可以选择使用jquery插件。

<head>
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.min.css"
 <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.jquery.min.js"></script>
 <script>
        jQuery(document).ready(function(){
            jQuery(".chosen").data("placeholder","Select Frameworks...").chosen();
        });
 </script>
</head>

 <body> 
   <label for="Test" class="col-md-3 control label">Test</label>
      <select class="chosen" style="width:350px" multiple="true">
            <option>Choose...</option>
            <option>Java</option>                           
            <option>C++</option>
            <option>Python</option>
     </select>
 </body>

答案 14 :(得分:0)

在这里。

// Same as:
// Task.Run(async () => await Method(...)).PipeTo(self);
Task.Run(() => Method(...)).PipeTo(self);

答案 15 :(得分:0)

你可以像这样创建自己的函数并在任何地方使用

Pure JS

/**
* Get values from multiple select input field
* @param {string} selectId - the HTML select id of the select field
**/
function getMultiSelectValues(selectId) {
 // get the options of select field which will be HTMLCollection
 // remember HtmlCollection and not an array. You can always enhance the code by
 // verifying if the provided select is valid or not
  var options = document.getElementById(selectId).options; 
    var values = [];
    
   // since options are HtmlCollection, we convert it into array to use map function on it
    Array.from(options).map(function(option) {
        option.selected ? values.push(option.value) : null
    })

    return values;
}

您可以在一行中使用 jQuery 获得相同的结果

$('#select_field_id').val()

这将返回 well 的值数组。