Get selected value in dropdown list using JavaScript
Asked Answered
M

31

2382

How do I get the selected value from a dropdown list using JavaScript?

<form>
  <select id="ddlViewBy">
    <option value="1">test1</option>
    <option value="2" selected="selected">test2</option>
    <option value="3">test3</option>
  </select>
</form>
Marble answered 6/7, 2009 at 7:25 Comment(0)
J
3774

Given a select element that looks like this:

<select id="ddlViewBy">
  <option value="1">test1</option>
  <option value="2" selected="selected">test2</option>
  <option value="3">test3</option>
</select>

Running this code:

var e = document.getElementById("ddlViewBy");
var value = e.value;
var text = e.options[e.selectedIndex].text;

Results in:

value == 2
text == "test2"

Interactive example:

var e = document.getElementById("ddlViewBy");
function onChange() {
  var value = e.value;
  var text = e.options[e.selectedIndex].text;
  console.log(value, text);
}
e.onchange = onChange;
onChange();
<form>
  <select id="ddlViewBy">
    <option value="1">test1</option>
    <option value="2" selected="selected">test2</option>
    <option value="3">test3</option>
  </select>
</form>
Jerejereld answered 6/7, 2009 at 7:29 Comment(13)
I am writing the exactly same code BUT inside a function in script tag. When the user will select that option from the drop-down menu, then I should be getting the text. So should I be using onclick/ontoggle/onchange ?Which of the one ?Dorrie
var strUser = e.options[e.selectedIndex].value; why not just var strUser = e.value ?Surgical
@TheRedPea—perhaps because when this answer was written there was a chance (however remote) that an ancient version of Netscape Navigator needed to be accommodated, so an equally ancient method for accessing the value of a single select was used. But I'm just guessing about that. ;-)Childress
I used like this: var e = document.getElementById("ddlViewBy").value;Splenectomy
@RishiDua you can iterate the options of the select: for(var o of e.options) { if (o.selected) { /* ... */ } }Wherefrom
Good answer but this doesn't work well for a multi select. Can someone assist?Trilbee
@Trilbee for(var o of e.options) { if (o.selected) { /* ... */ } } solution should work, although I dont remember what I did (2yr old comment).Nomarchy
should be e.target.options[e.target.selectedIndex].text don't know why it's wrong in all answers here..Shephard
e.val() was enough for meChiffchaff
Purists would even write const e = document.getElementById("ddlViewBy"); since it will not change (it's a DOM assumption)Bryannabryansk
@Shephard - Look at the assignment statement beginning with var e in the OP's question. While it's convention for e (or event) to represent the eventObject, here the OP is using it to represent the element.Headwaiter
@Chiffchaff That's jQuery, not plain JavaScript.Doe
caniuse.com/mdn-api_htmlselectelement_selectedindex says selectedIndex is also unsupported on ancient android browsers (2.1-4.3)Agglutinogen
T
476

Plain JavaScript:

var e = document.getElementById("elementId");
var value = e.options[e.selectedIndex].value;
var text = e.options[e.selectedIndex].text;

jQuery:

$("#elementId :selected").text(); // The text content of the selected option
$("#elementId").val(); // The value of the selected option

AngularJS: (http://jsfiddle.net/qk5wwyct):

// HTML
<select ng-model="selectItem" ng-options="item as item.text for item in items">
</select>
<p>Text: {{selectItem.text}}</p>
<p>Value: {{selectItem.value}}</p>

// JavaScript
$scope.items = [{
  value: 'item_1_id',
  text: 'Item 1'
}, {
  value: 'item_2_id',
  text: 'Item 2'
}];
Tantalus answered 18/12, 2011 at 2:8 Comment(6)
I must be doing something wrong because when I try this I get back the text of every option in the drop down.Barkentine
This did worked for me in different way. $("#ddlViewBy :selected").val() not without selectedMight
element.options[e.selectedIndex].value must be element.options[element.selectedIndex].valueGavelkind
Still useful - thank you for writing out the variations / language! Now if I only knew the equivalent for Office JS API Dropdown...Admiralty
should be e.target.options[e.target.selectedIndex].text don't know why it's wrong in all answers here..Shephard
It also worked for me in jQuery by simply putting $("#elementId").val() with no need to mention the selectedTriumvirate
W
197
var strUser = e.options[e.selectedIndex].value;

This is correct and should give you the value. Is it the text you're after?

var strUser = e.options[e.selectedIndex].text;

So you're clear on the terminology:

<select>
    <option value="hello">Hello World</option>
</select>

This option has:

  • Index = 0
  • Value = hello
  • Text = Hello World
Weightlessness answered 6/7, 2009 at 7:29 Comment(4)
i thought the ".value" in javascript should returns the value for me but only the ".text" would returns as what the .SelectedValue in asp.net returns. Thanks for example given!Marble
Yep - make the value of the option the same as what it is. Simpler - the guy above needs to write more code to make up for his initial vagueness.Dextro
should be e.target.options[e.target.selectedIndex].text don't know why it's wrong in all answers here..Shephard
I create modals using this code: <script src="jsuites.net/v5/jsuites.js"></script> <link rel="stylesheet" href="jsuites.net/v5/jsuites.css" type="text/css" /> <div id="dropdown"></div> <script> jSuites.dropdown(document.getElementById('dropdown'), { data: [ {group: 'Breads', value: '1', text: 'Wholemeal'}, {group: 'Breakfast Cereals', value: '4', text: 'Porridge'}, {group: 'Grains', value: '5', text: 'Rice'}, {group: 'Other products', value: '6', text: 'Pasta'}, ], width: '280px', autocomplete: true, }); </script>Tongs
B
72

The following code exhibits various examples related to getting/putting of values from input/select fields using JavaScript.

Source Link

Working Javascript & jQuery Demo

enter image description here

enter image description here

 <select id="Ultra" onchange="run()">  <!--Call run() function-->
     <option value="0">Select</option>
     <option value="8">text1</option>
     <option value="5">text2</option>
     <option value="4">text3</option>
</select><br><br>
TextBox1<br>
<input type="text" id="srt" placeholder="get value on option select"><br>
TextBox2<br>
<input type="text" id="rtt"  placeholder="Write Something !" onkeyup="up()">

The following script is getting the value of the selected option and putting it in text box 1

<script>
    function run() {
        document.getElementById("srt").value = document.getElementById("Ultra").value;
    }
</script>

The following script is getting a value from a text box 2 and alerting with its value

<script>
    function up() {
        //if (document.getElementById("srt").value != "") {
            var dop = document.getElementById("srt").value;
        //}
        alert(dop);
    }
</script>

The following script is calling a function from a function

<script>
    function up() {
        var dop = document.getElementById("srt").value;
        pop(dop); // Calling function pop
    }

    function pop(val) {
        alert(val);
    }?
</script>
Battology answered 3/12, 2012 at 6:50 Comment(1)
onchange=run(this.value) or (this.text) can be more benefficial.Cuyler
R
55
var selectedValue = document.getElementById("ddlViewBy").value;
Radiation answered 25/10, 2013 at 13:27 Comment(1)
This is the simplest solution, at least for modern browsers. See also W3Schools.Podvin
I
27

If you ever run across code written purely for Internet Explorer you might see this:

var e = document.getElementById("ddlViewBy");
var strUser = e.options(e.selectedIndex).value;

Running the above in Firefox et al will give you an 'is not a function' error, because Internet Explorer allows you to get away with using () instead of []:

var e = document.getElementById("ddlViewBy");
var strUser = e.options[e.selectedIndex].value;

The correct way is to use square brackets.

Instructor answered 18/6, 2012 at 15:28 Comment(0)
Q
22

Use:

<select id="Ultra" onchange="alert(this.value)">
    <option value="0">Select</option>
    <option value="8">text1</option>
    <option value="5">text2</option>
    <option value="4">text3</option>
</select>

Any input/form field can use a “this” keyword when you are accessing it from inside the element. This eliminates the need for locating a form in the DOM tree and then locating this element inside the form.

Quelpart answered 14/4, 2015 at 13:45 Comment(0)
C
19

There are two ways to get this done either using JavaScript or jQuery.

JavaScript:

var getValue = document.getElementById('ddlViewBy').selectedOptions[0].value;

alert (getValue); // This will output the value selected.

OR

var ddlViewBy = document.getElementById('ddlViewBy');

var value = ddlViewBy.options[ddlViewBy.selectedIndex].value;

var text = ddlViewBy.options[ddlViewBy.selectedIndex].text;

alert (value); // This will output the value selected

alert (text); // This will output the text of the value selected

jQuery:

$("#ddlViewBy:selected").text(); // Text of the selected value

$("#ddlViewBy").val(); // Outputs the value of the ID in 'ddlViewBy'
Cero answered 23/7, 2018 at 13:18 Comment(0)
T
18

Beginners are likely to want to access values from a select with the NAME attribute rather than ID attribute. We know all form elements need names, even before they get ids.

So, I'm adding the getElementsByName() solution just for new developers to see too.

NB. names for form elements will need to be unique for your form to be usable once posted, but the DOM can allow a name be shared by more than one element. For that reason consider adding IDs to forms if you can, or be explicit with form element names my_nth_select_named_x and my_nth_text_input_named_y.

Example using getElementsByName:

var e = document.getElementsByName("my_select_with_name_ddlViewBy")[0];
var strUser = e.options[e.selectedIndex].value;
Tsushima answered 9/3, 2011 at 3:32 Comment(1)
Doesn't work if my_select_with_name_ddlViewBy is an array like my_select_with_name_ddlViewBy[]Cottbus
Q
15

Just use

  • $('#SelectBoxId option:selected').text(); for getting the text as listed

  • $('#SelectBoxId').val(); for getting the selected index value

Quasar answered 18/2, 2014 at 11:1 Comment(1)
This uses jQuery, which doesn't answer the OP's question.Ohmage
K
15

I'm not sure if I totally understand your question, but this worked for me:

Use an onchange() event in your HTML, for example.

<select id="numberToSelect" onchange="selectNum()">
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
</select>

JavaScript

function selectNum() {
    var strUser = document.getElementById("numberToSelect").value;
}

This will give you whatever value is on the select dropdown per click.

Kitten answered 29/1, 2020 at 13:23 Comment(0)
S
9

The previous answers still leave room for improvement because of the possibilities, the intuitiveness of the code, and the use of id versus name. One can get a read-out of three data of a selected option -- its index number, its value and its text. This simple, cross-browser code does all three:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Demo GetSelectOptionData</title>
</head>
<body>
    <form name="demoForm">
        <select name="demoSelect" onchange="showData()">
            <option value="zilch">Select:</option>
            <option value="A">Option 1</option>
            <option value="B">Option 2</option>
            <option value="C">Option 3</option>
        </select>
    </form>

    <p id="firstP">&nbsp;</p>
    <p id="secondP">&nbsp;</p>
    <p id="thirdP">&nbsp;</p>

    <script>
        function showData() {
            var theSelect = demoForm.demoSelect;
            var firstP = document.getElementById('firstP');
            var secondP = document.getElementById('secondP');
            var thirdP = document.getElementById('thirdP');
            firstP.innerHTML = ('This option\'s index number is: ' + theSelect.selectedIndex + ' (Javascript index numbers start at 0)');
            secondP.innerHTML = ('Its value is: ' + theSelect[theSelect.selectedIndex].value);
            thirdP.innerHTML = ('Its text is: ' + theSelect[theSelect.selectedIndex].text);
        }
    </script>
</body>
</html>

Live demo: http://jsbin.com/jiwena/1/edit?html,output .

id should be used for make-up purposes. For functional form purposes, name is still valid, also in HTML5, and should still be used. Lastly, mind the use of square versus round brackets in certain places. As was explained before, only (older versions of) Internet Explorer will accept round ones in all places.

Saxecoburggotha answered 22/5, 2015 at 2:42 Comment(0)
N
9

Using jQuery:

$('select').val();
Nari answered 25/5, 2016 at 18:42 Comment(0)
P
8

Another solution is:

document.getElementById('elementId').selectedOptions[0].value
Psychodrama answered 18/7, 2018 at 18:49 Comment(1)
It is not cross-browser compatible.Reservist
T
8

The simplest way to do this is:

var value = document.getElementById("selectId").value;
Thecla answered 1/4, 2020 at 12:34 Comment(2)
He wants not the value but the shown text of the select boxSparklesparkler
I think this is the actual answer most people are looking for.Intermediary
H
7

You can use querySelector.

E.g.

var myElement = document.getElementById('ddlViewBy');

var myValue = myElement.querySelector('[selected]').value;
Headwaiter answered 4/1, 2018 at 22:36 Comment(0)
G
7

Most answers here get the value of the "this" select menu onchange by a plain text JavaScript selector.

For example:

document.getElementById("ddlViewBy").value;

This is not a DRY approach.

DRY (three lines of code):

function handleChange(e) {
  let innerText = e.target[e.target.options.selectedIndex].innerText;
  let value = e.target.value;
  /* Do something with these values */
}

Get the first select option:

console.log(e.target[0]); /* Output: <option value="value_hello">Hello innerText</option>*/

With this idea in mind, we dynamically return a "this" select option item (by selectedIndex):

e.target[e.target.options.selectedIndex].innerText;

Demo

let log = document.getElementById('log');

function handleChange(e) {
  let innerText = e.target[e.target.options.selectedIndex].innerText;
  let value = e.target.value;

  log.innerHTML = `<table>
    <tr><th>value</th><th>innerText</th></tr>
    <tr><td>${value}</td><td>${innerText}</td></tr>
  </table>`;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/milligram/1.4.1/milligram.css">

<select id="greet" onchange="handleChange(event)">
  <option value="value_hello">Hello innerText</option>
  <option value="value_goodbye">Goodbye innerText</option>
  <option value="value_seeYou">See you... innerText</option>
</select>

<select id="other_select_menu" onchange="handleChange(event)">
  <option value="value_paris">Paris innerText</option>
  <option value="value_ny">New York innerText</option>
</select>

<div id="log"></div>
Gracchus answered 7/5, 2022 at 13:51 Comment(1)
there's DRY and there's verbosity to make your code easier to understand. I feel this answer adds complexity on multiple levels in this case.Agglutinogen
I
6

Running example of how it works:

var e = document.getElementById("ddlViewBy");
var val1 = e.options[e.selectedIndex].value;
var txt = e.options[e.selectedIndex].text;

document.write("<br />Selected option Value: "+ val1);
document.write("<br />Selected option Text: "+ txt);
<select id="ddlViewBy">
  <option value="1">test1</option>
  <option value="2">test2</option>
  <option value="3"  selected="selected">test3</option>
</select>

Note: The values don't change as the dropdown is changed, if you require that functionality then an onClick change is to be implemented.

Insoluble answered 2/8, 2017 at 13:19 Comment(1)
Good answer for showing how the code needs to be refreshed after used!Bruce
S
5

To go along with the previous answers, this is how I do it as a one-liner. This is for getting the actual text of the selected option. There are good examples for getting the index number already. (And for the text, I just wanted to show this way)

let selText = document.getElementById('elementId').options[document.getElementById('elementId').selectedIndex].text

In some rare instances you may need to use parentheses, but this would be very rare.

let selText = (document.getElementById('elementId')).options[(document.getElementById('elementId')).selectedIndex].text;

I doubt this processes any faster than the two line version. I simply like to consolidate my code as much as possible.

Unfortunately this still fetches the element twice, which is not ideal. A method that only grabs the element once would be more useful, but I have not figured that out yet, in regards to doing this with one line of code.

Schlock answered 12/5, 2017 at 16:25 Comment(0)
F
5

I have a bit different view of how to achieve this. I'm usually doing this with the following approach (it is an easier way and works with every browser as far as I know):

<select onChange="functionToCall(this.value);" id="ddlViewBy">
  <option value="value1">Text one</option>
  <option value="value2">Text two</option>
  <option value="value3">Text three</option>
  <option value="valueN">Text N</option>
</select>
Fulmis answered 12/10, 2018 at 11:39 Comment(0)
L
5

In more modern browsers, querySelector allows us to retrieve the selected option in one statement, using the :checked pseudo-class. From the selected option, we can gather whatever information we need:

const opt = document.querySelector('#ddlViewBy option:checked');
// opt is now the selected option, so
console.log(opt.value, 'is the selected value');
console.log(opt.text, "is the selected option's text");
<select id="ddlViewBy">
  <option value="1">test1</option>
  <option value="2" selected="selected">test2</option>
  <option value="3">test3</option>
</select>
Luciferin answered 8/6, 2020 at 20:50 Comment(0)
S
4

In 2015, in Firefox, the following also works.

e.options.selectedIndex

Shipyard answered 22/10, 2015 at 22:38 Comment(0)
C
4

You should be using querySelector to achieve this. This also standardizes the way of getting a value from form elements.

var dropDownValue = document.querySelector('#ddlViewBy').value;

Fiddle: https://jsfiddle.net/3t80pubr/

Cyclades answered 16/1, 2020 at 23:39 Comment(0)
G
4

I think you can attach an event listener to the select tag itself e.g:

<script>
  document.addEventListener("DOMContentLoaded", (_) => {
    document.querySelector("select").addEventListener("change", (e) => {
      console.log(e.target.value);
    });
  });
</script>

In this scenario, you should make sure you have a value attribute for all of your options, and they are not null.

Godlike answered 20/7, 2020 at 20:6 Comment(1)
Great answer, thank you! In my case, I have two selectors, but I was able to access the selector id with 'e.srcElement.id'Wintery
K
4

event.target.value inside the onChange callback did the trick for me.

Krona answered 22/4, 2021 at 3:50 Comment(0)
M
3

Here is a JavaScript code line:

var x = document.form1.list.value;

Assuming that the dropdown menu named list name="list" and included in a form with name attribute name="form1".

Molech answered 27/2, 2017 at 21:4 Comment(1)
OP said that didn't work for them: "I tried the methods below but they all return the selected index instead of the value: var as = document.form1.ddlViewBy.value;..."Bruce
M
3
<select name="test" id="test" >
    <option value="1" full-name="Apple">A</option>
    <option value="2" full-name="Ball">B</option>
    <option value="3" full-name="Cat" selected>C</option>
</select>

var obj  = document.getElementById('test');
obj.options[obj.selectedIndex].value;  //3
obj.options[obj.selectedIndex].text;   //C
obj.options[obj.selectedIndex].getAttribute('full-name'); //Cat
obj.options[obj.selectedIndex].selected; //true
Megmega answered 26/4, 2022 at 10:44 Comment(0)
D
2

Try

ddlViewBy.value                      // value

ddlViewBy.selectedOptions[0].text    // label

console.log( ddlViewBy.value );

console.log( ddlViewBy.selectedOptions[0].text );
<select id="ddlViewBy">
  <option value="1">Happy</option>
  <option value="2">Tree</option>
  <option value="3"  selected="selected">Friends</option>
</select>
Dromond answered 18/12, 2019 at 20:19 Comment(0)
D
1

Here's an easy way to do it in an onchange function:

event.target.options[event.target.selectedIndex].dataset.name

Danyluk answered 16/4, 2014 at 20:52 Comment(1)
Talking about simplicity, I was thinking about this instead of event.targetGalbreath
A
0

Just do: document.getElementById('idselect').options.selectedIndex

Then you’ll get the select index value, starting at 0.

Anderton answered 22/12, 2018 at 15:3 Comment(0)
F
0

There is a workaround, using the EasyUI framework with all of its plugins.

You only need to add some EasyUI object that can read from an input as a "bridge" to the drop-down menu.

Example: easyui-searchbox

To the left, the drop-down, to the right, the easyui-searchbox:

enter image description here

...
<input id="ss" class="easyui-searchbox" style="width:300px"
        data-options="  searcher:my_function,
                        prompt:'Enter value',
                        menu:'#mm'">
<div id="mm" style="width:200px">
    <div data-options="name:'1'">test1</div>
    <div data-options="name:'2'">test2</div>
</div>
...
...
<script type="text/javascript">
    function my_js_function(triggeredByButton = false){
        // normal text of the searchbox (what you entered)
        var value = $("#ss").searchbox("getValue");
        // what you chose from the drop-down menu
        var name = $("#ss").searchbox("getName");
...

Mind: the var name is the '1' or '2', that is, the "value of the drop-down", while var value is the value that was entered in the easyui-searchbox instead and not relevant if you only want to know the value of the drop-down.

I checked how EasyUI fetches that #mm name, and I could not find out how to get that name without the help of EasyUI. The jQuery behind getName:

getName:function(jq){
return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name");
}

Mind that the return of this function is not the value of the easyui-searchbox, but the name of the #mm drop-down that was used as the menu parameter of the easyui-searchbox. Somehow EasyUI must get that other value, therefore it must be possible.

If you do not want any plugin to be seen, make it as tiny as possible? Or find perhaps a plugin that does not need a form at all in the link above, I just did not take the time.

Feudal answered 18/7, 2022 at 20:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.