<Select multiple = multiple> seçeneğinden seçilen tüm değerler nasıl alınır?


115

Garip görünüyordu, bunu zaten sorulmuş bulamadım, ama işte başlıyor!

Aşağıdaki gibi bir html'ye sahibim:

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

Kullanıcının javascript'te seçtiği tüm değerleri (bir dizi mi?) Nasıl elde ederim?

Örneğin, kullanıcı Öğle Yemeği ve Atıştırmalıklar'ı seçtiyse, bir {2, 4} dizisi istiyorum.

Bu çok basit bir görev gibi görünüyor ama yapamıyorum.

Teşekkürler.


1


Yanıtlar:


105

Her zamanki yol:

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

Gönderen docs :

<select multiple="multiple">Öğeler söz konusu olduğunda , .val()yöntem , seçilen her seçeneği içeren bir dizi döndürür;


10
@augurone: Öyle olduğunu iddia ediyor muyum?
Felix Kling

9
@FelixKling, sadece bunun için jQuery kütüphanesinin tamamını içerebilecek birini, gerçekten ihtiyacı olmadığı sürece yapmaması gerektiğini anlamadan önce yanlış yönlendirdi.
Aamir Afridi

32
@AamirAfridi: soru jQuery ile etiketlendi. Bir soruyu bir kitaplıkla etiketlemek, genellikle operasyonun o kitaplığı kullandığı ve kitaplığı kullanan yanıtların hoş karşılanacağı anlamına gelir. Bugün jQuery'ye giriş için alternatif bir yol önerebilir miyim? Olabilir. Ancak bu soru 3 yıldan daha eski. OP'nin diğer cevapla ilgili yorumuna da bakın: stackoverflow.com/questions/11821261/…
Felix Kling

12
Haklısın. Sorunun jQuery ile etiketlenmiş olması mantıklıdır 😐
Aamir Afridi

148

Bir soru JQuery için sorulmadıkça, birçok kişi sitelerinde JQuery kullanmadığından, soru ilk olarak standart javascript ile cevaplanmalıdır.

RobG'dan JavaScript kullanarak bir çoklu seçim kutusunun tüm seçili değerleri nasıl elde edilir? :

  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 ile etiketlenmiş.
Kyle

1
ha, görmedim: / hala +1
mw_21

6
Peki ya selectedOptions? Yeterince çapraz tarayıcı değil mi? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits

valueÖznitelik olmadığında opt.value= opt.text.
thdoan

1
En sonunda! Vanilya ... en sevdiğim lezzet
papiro

46

Aslında, saf JavaScript kullanarak en iyi, en özlü, en hızlı ve en uyumlu yolu buldum (IE lte 8'i tam olarak desteklemeniz gerekmediğini varsayarak) şudur:

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

GÜNCELLEME (2017-02-14):

ES6 / ES2015'i kullanmanın daha da özlü bir yolu (onu destekleyen tarayıcılar için):

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

7
Alternatif olarak, öğeye Array.from(element.querySelectorAll("option:checked"),e=>e.value);
sahipseniz

1
Bilginize, selectedOptions / options koleksiyonunu kullanmak querySelectorAll kullanmaktan daha hızlıdır.
Adam Leggett

4
Teşekkürler @AdamLeggett. Bilmiyorum olanlara Referans için, buna yukarıdaki Someguynamedpie kodundan @ marka değiştirecektir: Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Olurdu, ancak aşağıdaki cevabımı görün - IE'de hiç çalışmıyor ve Chrome ve Firefox'un bazı eski sürümlerinde garip davranışlara sahip. Performansı önemsemiyorsanız, querySelectorAll veya filtering element.options işi halleder. Ayrıca, Array.from () kullanmak yerine [] .map.call () yapabilirsiniz, bunun performans üzerinde ne gibi bir etkisi olacağını bilmiyorum ama kesinlikle olumsuz olmaz.
Adam Leggett

kullanıldı checked Bu benim için $(".multiple_select > option:checked").each(function(){ console.log(this.value) });
çoktan

15

Modern yoldan gitmek istiyorsanız, bunu yapabilirsiniz:

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

...Operatör iterable (harita HTMLOptionsCollectiondizi).

Değerlerle sadece ilgileniyorsanız, bir map()arama ekleyebilirsiniz :

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

Bu cevap çok daha fazla itibarı hak ediyor. Mükemmel çözüm, teşekkürler!
Silver Ringvee

10

İlk olarak, nesneyi bir diziye Array.fromdönüştürmek için kullanın 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') seçilen tüm öğelerin bir dizisini içerecektir.

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


6

Ekim 2019 Güncellemesi

Aşağıdakiler, herhangi bir bağımlılık veya aktarım olmaksızın tüm modern tarayıcılarda "bağımsız" çalışmalıdır.

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

Bunu dene:

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

gösteri

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

Vaktini boşa harcamak


3

her değerden sonra aralarla ifade ettiğiniz gibi isterseniz;

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

Değişikliklere yanıt vermeniz gerekiyorsa, şunu deneyebilirsiniz:

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

İçin [].slice.call(e.target.selectedOptions)gereklidir çünkü e.target.selectedOptionsbir HTMLCollectiondeğil a döndürür Array. Bu çağrı, onu Array, daha sonra mapdeğerleri çıkaran işlevi uygulayabilmemiz için dönüştürür .


1
Ne yazık ki bu her yerde işe yaramayacak, ortaya çıktı ki IE11'de seçili seçenekler yok. Ancak aşağıdakiler işe Array.prototype.slice.call(field.querySelectorAll(':checked'))
yarar

0

Aşağıdakine benzer bir şey benim seçimim olacaktır:

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

Kısa, modern tarayıcılarda hızlı ve% 1 pazar payı tarayıcılarında hızlı olup olmaması umurumuzda değil.

Unutmayın, selectedOptions yaklaşık 5 yıl öncesinden bazı tarayıcılarda riskli davranışlara sahiptir, bu nedenle bir kullanıcı aracısı koklama burada tamamen kural dışı değildir.


0

Kullanabilirsiniz 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 olmadan her yerde çalışır:

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'de desteklenmiyor
Dustin Poissant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.