Làm thế nào để lấy tất cả các giá trị đã chọn của một hộp nhiều lựa chọn?


77

Tôi có một <select>phần tử với multiplethuộc tính. Làm cách nào để lấy các giá trị đã chọn của phần tử này bằng JavaScript?

Đây là những gì tôi đang thử:

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;
}

bạn có thể đã tiết kiệm rất nhiều thời gian khi tìm kiếm một nửa tiêu đề của mình trong google ... google.com/…
neurino

Bạn có viết mã nào không? Với điều đó sẽ dễ dàng giúp đỡ :)
Nobita

Câu trả lời:


109

Không có 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;
}

Ví dụ nhanh:

<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
Cảm ơn bạn vì câu trả lời này. Bạn có thể vui lòng bước qua nó cho tôi? Tôi nghĩ rằng tôi hiểu rõ nhất về nó, nhưng phải var options = select && select.options;làm gì? Trong tôi thiếu kinh nghiệm , tôi mong rằng đượcvar options = select.options;
TecBrat

12
selectkhông phải là tên biến tốt nhất trong JavaScript.
VisioN

4
@TecBrat var options = select && select.optionsđảm bảo rằng lựa chọn không phải là không xác định, trước khi truy cập các thuộc tính của nó.
Qwerty

Tôi không nghĩ dòng với && có nhiều ý nghĩa ... nếu selectkhông được xác định getElementByIdsẽ trả về null. Trong trường hợp này, optionssẽ là null và có lỗi khi bạn cố gắng truy cập vào thuộc tính length. Nhưng có lẽ tôi đang thiếu một cái gì đó?
Xen_mar

33

ES6

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

Trong trường hợp selectlà một tham chiếu đến <select>phần tử.

Để phá vỡ nó:

  • [...select.options]lấy danh sách các tùy chọn giống như Array và hủy nó để chúng ta có thể sử dụng các phương thức Array.prototype trên đó (Chỉnh sửa: cũng xem xét sử dụng Array.from())
  • filter(...) giảm các tùy chọn xuống chỉ những tùy chọn được chọn
  • map(...)chuyển đổi các <option>phần tử thô thành các giá trị tương ứng của chúng

4
Triển khai chức năng tốt :)
roadev

Bạn có thể sử dụng chỉ giảm () phương pháp thực hiện của tôi
To_wave

Nếu bạn có thể lấy tham chiếu đến <select>, tại sao không bỏ qua bước filter () và chỉ lấy tham chiếu đến: con đã kiểm tra của <select> bằng querySelectorAll?
Evgeny

1
@Evgeny nhiều cách để giải quyết nó. Bạn nên đăng cách tiếp cận của mình trong một câu trả lời mới.
Rick Viscomi,

1
@Anentropic đây là một câu hỏi hay nhưng tôi không nghĩ rằng hiệu quả quan trọng lắm trừ khi chúng ta đang nói về hàng trăm hoặc hàng nghìn lựa chọn.
Rick Viscomi

28

Kiểm tra:

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;
});

NHẤN VÀO ĐÂY ĐỂ XEM DEMO


1
Không phải là một người hâm mộ - "HTML" không phải là HTML (có thể đọc được, nhưng không phải HTML) và câu trả lời yêu cầu thêm JQuery làm phụ thuộc.
Iiridayn

10

Khá giống với những gì đã được đề xuất nhưng hơi khác một chút. Về nhiều mã như jQuery trong Vanilla JS :

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

có vẻ nhanh hơn hơn một vòng lặp trong IE, FF và Safari. Tôi thấy thú vị là nó chậm hơn trong Chrome và Opera.

Một cách tiếp cận khác sẽ là sử dụng các bộ chọn:

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

Không phải chức năng của cái đầu tiên đã có trong Javascript?
Arlen Beiler

1
OK đã nhận nó. Nhưng cái đầu tiên có thể ngắn hơn. Chỉ là select.selectedOptions.
Arlen Beiler

1
Đó là một nhược điểm của JS trần so với việc sử dụng thư viện. Thuộc tính selectOptions thiếu hỗ trợ trình duyệt đáng tin cậy . Thư viện như jQuery sẽ ẩn điều đó khỏi bạn. Đã có nhiều thay đổi kể từ năm 2013 nhưng google nhanh chóng cho thấy mọi người vẫn gặp vấn đề với Lựa chọn tùy chọn.
uKolka

10

giả sử multiSelect là Multiple-Select-Element, chỉ cần sử dụng Thuộc tính đã chọn của nó:

//show all selected options in the console:

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

Thay vì chỉ đăng mã, hãy tăng chi tiết về cách mã hoạt động.
Phiter

Xin đừng đưa đoạn chỉ cho JS, nó vô nghĩa mà không cần HTML và chỉ cung cấp cho các lỗi
Bóng Wizard là tiêm

@ShadowWizard đã hiểu
KAFFEECKO

Lưu ý rằng selectedOptionsnó không được hỗ trợ trong IE. developer.mozilla.org/en-US/docs/Web/API/…
2540625

4

Đây là một triển khai ES6 :

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

Điều này hoạt động tuyệt vời. Điều thú vị là vì element.optionslà bộ sưu tập trực tiếp nên không thể giảm bớt. Đầu tiên nó phải được chuyển đổi thành Mảng như trong câu trả lời ở trên.
Brandon

3

Kiểm tra điều này:

HTML:

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

Mã một dòng Javascript

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

2

Bạn có thể thử tập lệnh này

     <!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>

2

Bạn có thể sử dụng [].reduceđể triển khai nhỏ gọn hơn phương pháp của RobG :

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

Array.prototype.filter sẽ là một lựa chọn tốt hơn[].filter.call(ele.options, e => e.selected)
megawac

2

Xây dựng trên Rick Viscomi câu trả lời 's, hãy thử sử dụng HTML Chọn phần tử của selectedOptions bất động sản:

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

Chi tiết,

  • selectedOptions trả về danh sách các mục đã chọn.
  • Cụ thể, nó trả về một HTMLCollection chỉ đọc chứa HTMLOptionElements .
  • ...cú pháp lây lan . Nó mở rộng các HTMLCollectionphần tử của.
  • [...]tạo một Arrayđối tượng có thể thay đổi từ các phần tử này, cung cấp cho bạn một mảng HTMLOptionElements.
  • map()thay thế mỗi HTMLObjectElementtrong mảng (ở đây được gọi là option) bằng giá trị của nó ( option.value).

Dày đặc, nhưng nó có vẻ hoạt động.

Xem ra, selectedOptions không được hỗ trợ bởi IE!


1

Giống như câu trả lời trước đó nhưng sử dụng underscore.js.

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

1

Trình trợ giúp mẫu của tôi trông như thế này:

 '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
}

1

Đây rồi.

const arr = Array.from(el.features.selectedOptions) //get array from selectedOptions property
const list = [] 
arr.forEach(item => list.push(item.value)) //push each item to empty array
console.log(list)

0

Mã Riot js

this.GetOpt=()=>{

let opt=this.refs.ni;

this.logger.debug("Options length "+opt.options.length);

for(let i=0;i<=opt.options.length;i++)
{
  if(opt.options[i].selected==true)
    this.logger.debug(opt.options[i].value);
}
};

//**ni** is a name of HTML select option element as follows
//**HTML code**
<select multiple ref="ni">
  <option value="">---Select---</option>
  <option value="Option1 ">Gaming</option>
  <option value="Option2">Photoshoot</option>
</select>

0

Bạn có thể sử dụng plugin jquery đã chọn.

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.