petworthnick
petworthnick

Reputation: 215

How do I create a list of the selected options from a dropdwon

I am trying to loop through a multiple select dropdown list and add all of the selected options to a comma separated list.

My dropdown code is:

<select name="testnameID" id="testnameID" multiple>
  <option value="1">Test number 1</option>
  <option value="2">Test number 2</option>
  <option value="3">Test number 3</option>
  <option value="4">Test number 4</option>
  <option value="5">Test number 5</option>
<select>

In my tag I am using the following, but think it can be simplified or improved:

var testnameID = $('#testnameID').val();
var testnameText;            
Array.from(document.querySelector("#testnameID").options).forEach(function(option_element) {
            let option_text = option_element.text;
            let is_option_selected = option_element.selected;

            if (is_option_selected===true){
                testnameText = testnameText + option_text +", ";
                console.log("TestnameText: "+testnameText);
                console.log("\n\r");
            }
            
        });

I need to generate a variable, testnameText, which if the first three items were selected, would return a value of "Test number 1, Test number 2, Test number 3"

I'm getting myself in a muddle!

Upvotes: 2

Views: 1083

Answers (3)

Teemu
Teemu

Reputation: 23406

selectedOptions contains all the selected options of a select element. You can use it like this:

const select = document.querySelector('select');
select.addEventListener('change', e => {
  // Option texts as an array
  const texts = Array.from(e.target.selectedOptions).map(({text}) => text);
  // Option texts as a comma-separated string
  const textsStr = texts.join(', ');
  console.log(texts);
  console.log(textsStr);
});
<select multiple>
  <option value="1">Test number 1</option>
  <option value="2">Test number 2</option>
  <option value="3">Test number 3</option>
  <option value="4">Test number 4</option>
  <option value="5">Test number 5</option>
</select>

This works outside of the event too, just refer the select element directly instead of e.target.

Upvotes: 0

Mamun
Mamun

Reputation: 68933

You can try using Document.querySelectorAll() to target all the selected options like the following way:

Array.from(document.querySelectorAll("#testnameID option:checked")).forEach(function(option_element) {
  let option_text = option_element.text;

  var testnameText = option_text +", ";
  console.log("TestnameText: "+testnameText);
  console.log("\n\r");
});
<select name="testnameID" id="testnameID" multiple>
  <option value="1" selected>Test number 1</option>
  <option value="2" selected>Test number 2</option>
  <option value="3" selected>Test number 3</option>
  <option value="4">Test number 4</option>
  <option value="5">Test number 5</option>
<select>

You can also try using Array.prototype.map() and Arrow function expressions which is more shorter.

The following example creates an array of the selected options:

var checkedOptions = Array.from(document.querySelectorAll("#testnameID option:checked"));
var res = checkedOptions.map(option_element => ("TestnameText: "+option_element.text));
console.log(res);
<select name="testnameID" id="testnameID" multiple>
  <option value="1" selected>Test number 1</option>
  <option value="2" selected>Test number 2</option>
  <option value="3" selected>Test number 3</option>
  <option value="4">Test number 4</option>
  <option value="5">Test number 5</option>
<select>

Upvotes: 3

Shahnawaz Hossan
Shahnawaz Hossan

Reputation: 2720

In this case, jquery's each() can help. So getting selected options is pretty simple:

$('#testnameID :selected').each(function (index, el) {
    console.log("TestnameText: " + $(el).text());
});
<script src="https://code.jquery.com/jquery-3.5.1.min.js"
    integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<select name="testnameID" id="testnameID" multiple>
    <option value="1" selected>Test number 1</option>
    <option value="2" selected>Test number 2</option>
    <option value="3" selected>Test number 3</option>
    <option value="4">Test number 4</option>
    <option value="5">Test number 5</option>
</select>

Upvotes: 0

Related Questions