Làm cách nào để lấy tất cả các giá trị đã chọn từ <select multiple = multiple>?


115

Có vẻ kỳ lạ, tôi không thể tìm thấy câu hỏi này đã được hỏi, nhưng đây là nó!

Tôi có một html như sau:

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

Làm cách nào để lấy tất cả các giá trị (một mảng?) Mà người dùng đã chọn trong javascript?

Ví dụ: nếu người dùng đã chọn Bữa trưa và Đồ ăn nhẹ, tôi muốn một mảng {2, 4}.

Đây có vẻ như là một nhiệm vụ rất đơn giản nhưng tôi dường như không thể làm được.

Cảm ơn.




Câu trả lời:


105

Cách thông thường:

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

Từ các tài liệu :

Trong trường hợp các <select multiple="multiple">phần tử, .val()phương thức trả về một mảng chứa mỗi tùy chọn đã chọn;


10
@augurone: Tôi có khẳng định là như vậy không?
Felix Kling

9
@FelixKling bạn vừa đánh lừa một người nào đó có thể ngay lập tức bao gồm toàn bộ jQuery lib chỉ cho điều này trước khi anh ta nhận ra rằng anh ta không nên trừ khi anh ta thực sự cần.
Aamir Afridi

32
@AamirAfridi: câu hỏi được gắn thẻ jQuery. Việc gắn thẻ câu hỏi với thư viện thường có nghĩa là op sử dụng thư viện đó và các câu trả lời sử dụng thư viện được hoan nghênh. Tôi cũng sẽ đề xuất một cách thay thế Ina door cho jQuery hôm nay chứ? Có lẽ. Nhưng câu hỏi này đã hơn 3 năm. Xem thêm nhận xét của OP trên câu trả lời khác: stackoverflow.com/questions/11821261/...
Felix Kling

12
Bạn đúng rồi. Nó có ý nghĩa nếu câu hỏi được gắn thẻ với jQuery 😐
Aamir Afridi

148

Trừ khi một câu hỏi yêu cầu JQuery, trước tiên câu hỏi phải được trả lời bằng javascript chuẩn vì nhiều người không sử dụng JQuery trong trang web của họ.

Từ RobG 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 bằng 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
Nó được gắn thẻ bằng jquery.
Kyle

1
ha, không thấy rằng: / vẫn +1
mw_21

6
Về selectedOptionsthì sao? Nó không đủ trình duyệt chéo? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits

Lưu ý rằng khi không có valuethuộc tính, thì opt.value= opt.text.
thdoan 30/03/18

1
Cuối cùng! Vani ... hương vị yêu thích của tôi
papiro 27/09/18

46

Trên thực tế, tôi đã tìm thấy cách tốt nhất, ngắn gọn nhất, nhanh nhất và tương thích nhất bằng cách sử dụng JavaScript thuần túy (giả sử bạn không cần hỗ trợ đầy đủ IE lte 8) là:

var values = Array.prototype.slice.call(document.querySelectorAll('#select-meal-type option:checked'),0).map(function(v,i,a) { 
    return v.value; 
});

CẬP NHẬT (14-02-2017):

Một cách ngắn gọn hơn nữa bằng cách sử dụng ES6 / ES2015 (dành cho các trình duyệt hỗ trợ nó):

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

7
Ngoài ra, nếu bạn có phần tử:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamepie

1
Chỉ FYI, sử dụng bộ sưu tập Tùy chọn / tùy chọn đã chọn sẽ nhanh hơn so với sử dụng querySelectorAll.
Adam Leggett

4
Cảm ơn @AdamLeggett. Để tham khảo cho những ai không biết, điều đó sẽ thay đổi làm cho @ đang Someguynamedpie của trên để: Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Nó sẽ, nhưng hãy xem câu trả lời của tôi bên dưới - nó hoàn toàn không hoạt động trên IE và có hành vi kỳ lạ trong một số phiên bản Chrome và Firefox cũ hơn. Nếu bạn không quan tâm đến hiệu suất, querySelectorAll hoặc filter element.options sẽ hoàn thành công việc. Ngoài ra, bạn có thể thực hiện [] .map.call () thay vì sử dụng Array.from (), tôi không biết điều này sẽ có tác động gì đến hiệu suất nhưng chắc chắn nó sẽ không tiêu cực.
Adam Leggett

sử dụng checked này làm việc cho tôi, trên một chọn thả xuống nhiều, nhưng nên làm việc cho tất cả thả xuống cũng$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

Nếu bạn muốn đi theo cách hiện đại, bạn có thể làm như sau:

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

Các ...nhà khai thác bản đồ iterable ( HTMLOptionsCollection) để mảng.

Nếu bạn chỉ quan tâm đến các giá trị, bạn có thể thêm map()lệnh gọi:

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

Câu trả lời này xứng đáng được ghi nhận nhiều hơn. Giải pháp hoàn hảo, cảm ơn!
Silver Ringvee

10

Đầu tiên, sử dụng Array.fromđể chuyển đổi HTMLCollectionđối tượng thành một mảng.

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') sẽ chứa một mảng tất cả các mục đã chọn.

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

Các bác sĩ cho biết thêm:


5

Cập nhật tháng 10 năm 2019

Phần sau sẽ hoạt động "độc lập" trên tất cả các trình duyệt hiện đại mà không có bất kỳ sự phụ thuộc hoặc chuyển đổi nào.

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

Thử cái này:

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

Bản giới thiệu

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

vĩ cầm


3

nếu bạn muốn như bạn đã trình bày với các dấu ngắt sau mỗi giá trị;

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

Nếu bạn cần phản hồi các thay đổi, bạn có thể thử cách này:

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

Các [].slice.call(e.target.selectedOptions)là cần thiết vì e.target.selectedOptionslợi nhuận một HTMLCollection, không phải là một Array. Lời gọi đó chuyển đổi nó thành để Arraysau đó chúng ta có thể áp dụng maphàm, hàm này trích xuất các giá trị.


1
Đáng buồn là điều này sẽ không hoạt động ở mọi nơi, hóa ra IE11 không có trường lựa chọn Tùy chọn. Tuy nhiên, điều sau không hoạt động:Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

0

Một cái gì đó như sau sẽ là lựa chọn của tôi:

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

Nó ngắn, nó nhanh trên các trình duyệt hiện đại và chúng tôi không quan tâm nó có nhanh hay không trên các trình duyệt 1% thị phần.

Xin lưu ý, selectOptions đã có những hành vi khó hiểu trên một số trình duyệt từ khoảng 5 năm trước, do đó, việc đánh giá tác nhân người dùng không hoàn toàn nằm ngoài luồng ở đây.


-1

Hoạt động ở mọi nơi mà không cần 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;
};

selectedOptiongskhông được hỗ trợ trong IE
Dustin Poissant
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.