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

ユーザーがJavaScriptで選択したすべての値(配列?)を取得するにはどうすればよいですか?

たとえば、ユーザーがランチとスナックを選択した場合、{2、4}の配列が必要です。

これは非常に簡単な作業のように思えますが、私にはできません。

ありがとう。




回答:


105

通常の方法:

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

ドキュメントから:

<select multiple="multiple">要素の場合、.val()メソッドは選択された各オプションを含む配列を返します。


10
@augurone:私はそれがそうであると主張していますか?
Felix Kling 2015

9
@FelixKlingあなたは、彼が本当に必要としない限り彼がすべきではないと気づく前に、このためにjQuery lib全体をすぐに含めるかもしれない誰かを単に見当違いにしました。
アーミルアフリディ2016

32
@AamirAfridi:質問はjQueryでタグ付けされています。質問にライブラリーをタグ付けすることは、通常、opがそのライブラリーを使用し、ライブラリーを使用して回答を歓迎することを意味します。今日、伊奈がjQueryにアクセスする別の方法も提案しますか?多分。しかし、この質問は3年以上前のものです。また、OPの他の回答に関するコメントもご覧ください。stackoverflow.com
Felix Kling

12
あなたが正しいです。質問はjQueryの😐でタグ付けされた場合、それは理にかなって
アーミルAfridi

148

多くの人がサイトでJQueryを使用していないため、質問がJQueryを要求しない限り、質問は最初に標準のJavaScriptで回答する必要があります。

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でタグ付けされています。
カイル

1
ha、それを見
なかった

6
どうselectedOptionsですか?クロスブラウザでは不十分ですか?Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
Tenbits 2015

value属性がない場合、opt.value=であることに注意してくださいopt.text
thdoan 2018年

1
最後に!バニラ...私のお気に入りのフレーバー
パピロ

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

それは可能ですが、以下の私の答えを参照してください-IEではまったく機能せず、一部の古いバージョンのChromeとFirefoxでは奇妙な動作をします。パフォーマンスを気にしない場合は、querySelectorAllまたはフィルタリングelement.optionsを使用すれば十分です。また、Array.from()を使用する代わりに[] .map.call()を実行することもできます。これがパフォーマンスにどのような影響を与えるかはわかりませんが、悪影響はありません。
Adam Leggett

使用済みchecked これは複数選択ドロップダウンで機能しましたが、すべてのドロップダウンでも機能するはずです$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

あなたが現代的な方法に行きたいなら、あなたはこれを行うことができます:

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

...オペレータは、反復可能に(マッピングHTMLOptionsCollectionアレイに)。

値だけに関心がある場合は、map()呼び出しを追加できます。

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

この答えは、より多くの信用に値します。完璧なソリューション、ありがとう!
シルバーリングビー

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%のブラウザで高速かどうかは関係ありません。

5年ほど前の一部のブラウザーでは、selectedOptionsの動作がおかしくなっているため、ユーザーエージェントのスニッフィングが完全に外れているわけではないことに注意してください。


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

selectedOptiongsはIEではサポートされていません
ダスティンポワサント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.