<select multiple = multiple>에서 선택한 모든 값을 가져 오는 방법은 무엇입니까?


115

이상하게 보였지만 이미 요청한 항목을 찾을 수 없었지만 여기에 있습니다!

다음과 같은 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>

사용자가 자바 스크립트에서 선택한 모든 값 (배열?)을 어떻게 얻습니까?

예를 들어 사용자가 점심 및 간식을 선택한 경우 {2, 4}의 배열이 필요합니다.

이것은 매우 간단한 작업 인 것 같지만 할 수없는 것 같습니다.

감사.




답변:


105

일반적인 방법 :

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

로부터 문서 :

<select multiple="multiple">요소 의 경우 .val()메서드는 선택한 각 옵션을 포함하는 배열을 반환합니다.


10
@augurone : 나는 그것을 주장합니까?
Felix Kling

9
@FelixKling 당신은 그가 정말로 필요하지 않는 한 그가해서는 안된다는 것을 깨닫기 전에 전체 jQuery lib를 곧바로 포함 할 수있는 사람을 잘못 안내했습니다.
Aamir Afridi 2016

32
@AamirAfridi : 질문은 jQuery로 태그가 지정됩니다. 라이브러리로 질문에 태그를 지정한다는 것은 일반적으로 운영자가 해당 라이브러리를 사용하고 라이브러리 사용에 대한 답변을 환영한다는 것을 의미합니다. Ina가 오늘 jQuery에 대한 대안을 제시 할 수도 있습니까? 아마도. 하지만이 질문은 3 년이 넘었습니다. 또한 다른 답변에 대한 OP의 의견을 참조하십시오. stackoverflow.com/questions/11821261/…
Felix Kling

12
당신이 옳습니다. 질문이 😐 jQuery를 태그하면 그것은 말이
아미르 아프 리디에게

148

질문이 JQuery를 요구하지 않는 한, 많은 사람들이 사이트에서 JQuery를 사용하지 않기 때문에 표준 자바 스크립트에서 질문에 먼저 답변해야합니다.

RobG에서 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
jquery로 태그가 지정됩니다.
Kyle


6
어때 selectedOptions? 브라우저 간 충분하지 않습니까? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits

value속성 이 없으면 opt.value= opt.text입니다.
thdoan

1
드디어! 바닐라 ... 내가 제일 좋아하는 맛
PAPIRO

46

실제로 순수 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);

7
다른 방법으로는 요소가있는 경우 :Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie

1
참고로 querySelectorAll을 사용하는 것보다 selectedOptions / options 컬렉션을 사용하는 것이 더 빠릅니다.
Adam Leggett

4
@AdamLeggett에게 감사드립니다. 모르는 사람들을 위해 위의 @Someguynamedpie 코드를 다음과 같이 변경 Array.from(element.selectedOptions).map(v=>v.value);합니다.
KyleFarris 2018

하지만 아래 내 대답을 참조하십시오-IE에서는 전혀 작동하지 않으며 일부 이전 버전의 Chrome 및 Firefox에서는 이상한 동작이 있습니다. 성능에 신경 쓰지 않으면 querySelectorAll 또는 필터링 element.options가 작업을 완료합니다. 또한 Array.from ()을 사용하는 대신 [] .map.call ()을 수행 할 수 있습니다. 이것이 성능에 어떤 영향을 미칠지 모르겠지만 확실히 부정적인 것은 아닙니다.
Adam Leggett

사용 checked 이 다중 선택 드롭 다운에, 나를 위해 일하지만,뿐만 아니라 모든 드롭 다운을 위해 일한다$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano 디아스을

15

현대적인 방식으로 가고 싶다면 다음과 같이 할 수 있습니다.

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

...연산자를 반복 가능한 (매핑 HTMLOptionsCollection배열로).

값에만 관심이있는 경우 map()호출을 추가 할 수 있습니다 .

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

이 답변은 더 많은 신용을받을 가치가 있습니다. 완벽한 솔루션, 감사합니다!
Silver Ringvee 19

10

먼저 객체를 배열 Array.from로 변환하는 데 사용 합니다 HTMLCollection.

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') 선택한 모든 항목의 배열이 포함됩니다.

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


6

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>

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>

깡깡이


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

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합니다.


1
슬프게도 이것은 모든 곳에서 작동하지 않으며 IE11에는 selectedOptions 필드가 없습니다. 그러나 다음은 작동합니다.Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

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 % 시장 점유율 브라우저에서 빠르 든 아니든 상관하지 않습니다.

selectedOptions는 약 5 년 전부터 일부 브라우저에서 불안정한 동작을 보였으므로 사용자 에이전트 스 니프가 여기에서 완전히 벗어나지 않습니다.


0

당신이 사용할 수있는 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>


-1

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

selectedOptiongsIE에서 지원되지 않음
Dustin Poissant 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.