set option "selected" attribute from dynamic created option
Asked Answered
W

19

75

I have a dynamically created select option using a javascript function. the select object is

<select name="country" id="country">
</select>

when the js function is executed, the "country" object is

<select name="country" id="country">
    <option value="AF">Afghanistan</option>
    <option value="AL">Albania</option>
    ...
    <option value="ID">Indonesia</option>
    ...
    <option value="ZW">Zimbabwe</option>
</select>

and displaying "Indonesia" as default selected option. note : there is no selected="selected" attribute in that option.

then I need to set selected="selected" attribute to "Indonesia", and I use this

var country = document.getElementById("country");
country.options[country.options.selectedIndex].setAttribute("selected", "selected");

using firebug, I can see the "Indonesia" option is like this

<option value="ID" selected="selected">Indonesia</option>

but it fails in IE (tested in IE 8).

and then I have tried using jQuery

$( function() {
    $("#country option:selected").attr("selected", "selected");
});

it fails both in FFX and IE.

I need the "Indonesia" option to have selected="selected" attribute so when I click reset button, it will select "Indonesia" again.

changing the js function to dynamically create "country" options is not an option. the solution must work both in FFX and IE.

thank you

Ways answered 4/1, 2011 at 3:6 Comment(0)
N
31

Good question. You will need to modify the HTML itself rather than rely on DOM properties.

var opt = $("option[val=ID]"),
    html = $("<div>").append(opt.clone()).html();
html = html.replace(/\>/, ' selected="selected">');
opt.replaceWith(html);

The code grabs the option element for Indonesia, clones it and puts it into a new div (not in the document) to retrieve the full HTML string: <option value="ID">Indonesia</option>.

It then does a string replace to add the attribute selected="selected" as a string, before replacing the original option with this new one.

I tested it on IE7. See it with the reset button working properly here: http://jsfiddle.net/XmW49/

Namnama answered 4/1, 2011 at 4:3 Comment(2)
a javascript only solution would have been betterSpearwort
@Spearwort would you write the javascript version of this solution?Thermoluminescence
C
127

You're overthinking it:

var country = document.getElementById("country");
country.options[country.options.selectedIndex].selected = true;
Cocoon answered 4/1, 2011 at 4:12 Comment(5)
That's not what the OP is asking for. OP wants the reset button to work.Namnama
Well.. that's not the response to what was asked, but I like it anyway since I was looking for this kind of approach =)Freshwater
Apparently from what others have said this doesn't match the question. However, it was exactly what I needed so thanks!Marti
After hours and hours of googling this finally fixed it for me, thank you so much!!!Asmara
This is close to what i needed, but for a test that checked the selected option by HTML (rather than its value) I needed to do this to actually change the HTML: country.options[country.options.selectedIndex].setAttribute('selected', 'true')Absorbefacient
N
31

Good question. You will need to modify the HTML itself rather than rely on DOM properties.

var opt = $("option[val=ID]"),
    html = $("<div>").append(opt.clone()).html();
html = html.replace(/\>/, ' selected="selected">');
opt.replaceWith(html);

The code grabs the option element for Indonesia, clones it and puts it into a new div (not in the document) to retrieve the full HTML string: <option value="ID">Indonesia</option>.

It then does a string replace to add the attribute selected="selected" as a string, before replacing the original option with this new one.

I tested it on IE7. See it with the reset button working properly here: http://jsfiddle.net/XmW49/

Namnama answered 4/1, 2011 at 4:3 Comment(2)
a javascript only solution would have been betterSpearwort
@Spearwort would you write the javascript version of this solution?Thermoluminescence
A
26

Instead of modifying the HTML itself, you should just set the value you want from the relative option element:

$(function() {
    $("#country").val("ID");
});

In this case "ID" is the value of the option "Indonesia"

Ambary answered 4/12, 2012 at 19:11 Comment(2)
This does not set the selected html tag inside the option tabRapids
This should set it properly for Indonesia: $("#country").val("ID");Takin
G
19

So many wrong answers!

To specify the value that a form field should revert to upon resetting the form, use the following properties:

  • Checkbox or radio button: defaultChecked
  • Any other <input> control: defaultValue
  • Option in a drop down list: defaultSelected

So, to specify the currently selected option as the default:

var country = document.getElementById("country");
country.options[country.selectedIndex].defaultSelected = true;

It may be a good idea to set the defaultSelected value for every option, in case one had previously been set:

var country = document.getElementById("country");
for (var i = 0; i < country.options.length; i++) {
    country.options[i].defaultSelected = i == country.selectedIndex;
}

Now, when the form is reset, the selected option will be the one you specified.

Georgie answered 7/11, 2015 at 2:29 Comment(0)
L
13
// get the OPTION we want selected
var $option = $('#SelectList').children('option[value="'+ id +'"]');
// and now set the option we want selected
$option.attr('selected', true);​​
Lumpfish answered 24/10, 2012 at 12:28 Comment(3)
should be var $opt = $('option[value='+ id +']'); $opt.attr('selected','selected');​​Bruise
Updated answer to a more modern solutionOctaviaoctavian
The solution i was looking for! This helps to spot the option with required value! Thank u @corradio!Hideous
M
9

What you want to do is set the selectedIndex attribute of the select box.

country.options.selectedIndex = index_of_indonesia;

Changing the 'selected' attribute will generally not work in IE. If you really want the behavior you're describing, I suggest you write a custom javascript reset function to reset all the other values in the form to their default.

Mackler answered 4/1, 2011 at 3:10 Comment(0)
C
7

This works in FF, IE9

var x = document.getElementById("country").children[2];
x.setAttribute("selected", "selected");
Chant answered 8/2, 2013 at 6:11 Comment(0)
P
7

Make option defaultSelected

HTMLOptionElement.defaultSelected = true;     // JS
$('selector').prop({defaultSelected: true});  // jQuery  

HTMLOptionElement MDN

If the SELECT element is already added to the document (statically or dynamically), to set an option to Attribute-selected and to make it survive a HTMLFormElement.reset() - defaultSelected is used:

const EL_country = document.querySelector('#country');
EL_country.value = 'ID';   // Set SELECT value to 'ID' ("Indonesia")
EL_country.options[EL_country.selectedIndex].defaultSelected = true; // Add Attribute selected to Option Element

document.forms[0].reset(); // "Indonesia" is still selected
<form>
  <select name="country" id="country">
    <option value="AF">Afghanistan</option>
    <option value="AL">Albania</option>
    <option value="HR">Croatia</option>
    <option value="ID">Indonesia</option>
    <option value="ZW">Zimbabwe</option>
  </select>
</form>

The above will also work if you build the options dynamically, and than (only afterwards) you want to set one option to be defaultSelected.

const countries = {
  AF: 'Afghanistan',
  AL: 'Albania',
  HR: 'Croatia',
  ID: 'Indonesia',
  ZW: 'Zimbabwe',
};

const EL_country = document.querySelector('#country');

// (Bad example. Ideally use .createDocumentFragment() and .appendChild() methods)
EL_country.innerHTML = Object.keys(countries).reduce((str, key) => str += `<option value="${key}">${countries[key]}</option>`, ''); 

EL_country.value = 'ID';
EL_country.options[EL_country.selectedIndex].defaultSelected = true;

document.forms[0].reset(); // "Indonesia" is still selected
<form>
  <select name="country" id="country"></select>
</form>

Option gets Attribute selected by using defaultSelected

Make option defaultSelected while dynamically creating options

To make an option selected while populating the SELECT Element, use the Option() constructor MDN

var optionElementReference = new Option(text, value, defaultSelected, selected);

const countries = {
  AF: 'Afghanistan',
  AL: 'Albania',
  HR: 'Croatia',
  ID: 'Indonesia',     // <<< make this one defaultSelected
  ZW: 'Zimbabwe',
};

const EL_country = document.querySelector('#country');
const DF_options = document.createDocumentFragment();

Object.keys(countries).forEach(key => {
  const isIndonesia = key === 'ID';  // Boolean
  DF_options.appendChild(new Option(countries[key], key, isIndonesia, isIndonesia))
});

EL_country.appendChild(DF_options);

document.forms[0].reset(); // "Indonesia" is still selected
<form>
  <select name="country" id="country"></select>
</form>

In the demo above Document.createDocumentFragment is used to prevent rendering elements inside the DOM in a loop. Instead, the fragment (containing all the Options) is appended to the Select only once.


SELECT.value vs. OPTION.setAttribute vs. OPTION.selected vs. OPTION.defaultSelected

Although some (older) browsers interpret the OPTION's selected attribute as a "string" state, the WHATWG HTML Specifications html.spec.whatwg.org state that it should represent a Boolean selectedness

The selectedness of an option element is a boolean state, initially false. Except where otherwise specified, when the element is created, its selectedness must be set to true if the element has a selected attribute.
html.spec.whatwg.org - Option selectedness

one can correctly deduce that just the name selected in <option value="foo" selected> is enough to set a truthy state.


Comparison test of the different methods

const EL_select = document.querySelector('#country');
const TPL_options = `
  <option value="AF">Afghanistan</option>
  <option value="AL">Albania</option>
  <option value="HR">Croatia</option>
  <option value="ID">Indonesia</option>
  <option value="ZW">Zimbabwe</option>
`;

// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/MutationObserver
const mutationCB = (mutationsList, observer) => {
  mutationsList.forEach(mu => {
    const EL = mu.target;
    if (mu.type === 'attributes') {
      return console.log(`* Attribute ${mu.attributeName} Mutation. ${EL.value}(${EL.text})`);
    }
  });
};

// (PREPARE SOME TEST FUNCTIONS)

const testOptionsSelectedByProperty = () => {
  const test = 'OPTION with Property selected:';
  try {
    const EL = [...EL_select.options].find(opt => opt.selected);
    console.log(`${test} ${EL.value}(${EL.text}) PropSelectedValue: ${EL.selected}`);
  } catch (e) {
    console.log(`${test} NOT FOUND!`);
  }
} 

const testOptionsSelectedByAttribute = () => {
  const test = 'OPTION with Attribute selected:'
  try {
    const EL = [...EL_select.options].find(opt => opt.hasAttribute('selected'));
    console.log(`${test} ${EL.value}(${EL.text}) AttrSelectedValue: ${EL.getAttribute('selected')}`);
  } catch (e) {
    console.log(`${test} NOT FOUND!`);
  }
} 

const testSelect = () => {
  console.log(`SELECT value:${EL_select.value} selectedIndex:${EL_select.selectedIndex}`);
}

const formReset = () => {
  EL_select.value = '';
  EL_select.innerHTML = TPL_options;
  // Attach MutationObserver to every Option to track if Attribute will change
  [...EL_select.options].forEach(EL_option => {
    const observer = new MutationObserver(mutationCB);
    observer.observe(EL_option, {attributes: true});
  });
}

// -----------
// LET'S TEST! 

console.log('\n1. Set SELECT value');
formReset();
EL_select.value = 'AL'; // Constatation: MutationObserver did NOT triggered!!!!
testOptionsSelectedByProperty();
testOptionsSelectedByAttribute();
testSelect();

console.log('\n2. Set HTMLElement.setAttribute()');
formReset();
EL_select.options[2].setAttribute('selected', true); // MutationObserver triggers
testOptionsSelectedByProperty();
testOptionsSelectedByAttribute();
testSelect();

console.log('\n3. Set HTMLOptionElement.defaultSelected');
formReset();
EL_select.options[3].defaultSelected = true; // MutationObserver triggers
testOptionsSelectedByProperty();
testOptionsSelectedByAttribute();
testSelect();

console.log('\n4. Set SELECT value and HTMLOptionElement.defaultSelected');
formReset();
EL_select.value = 'ZW'
EL_select.options[EL_select.selectedIndex].defaultSelected = true; // MutationObserver triggers
testOptionsSelectedByProperty();
testOptionsSelectedByAttribute();
testSelect();

/* END */
console.log('\n*. Getting MutationObservers out from call-stack...');
<form>
  <select name="country" id="country"></select>
</form>

Although the test 2. using .setAttribute() seems at first the best solution since both the Element Property and Attribute are unison, it can lead to confusion, specially because .setAttribute expects two parameters:

EL_select.options[1].setAttribute('selected', false);
// <option value="AL" selected="false"> // But still selected!

will actually make the option selected

Should one use .removeAttribute() or perhaps .setAttribute('selected', ???) to another value? Or should one read the state by using .getAttribute('selected') or by using .hasAttribute('selected')?

Instead test 3. (and 4.) using defaultSelected gives the expected results:

  • Attribute selected as a named Selectedness state.
  • Property selected on the Element Object, with a Boolean value.
Picked answered 7/8, 2019 at 3:16 Comment(0)
H
3
select = document.getElementById('selectId');
var opt = document.createElement('option');
    opt.value = 'value';
    opt.innerHTML = 'name';
    opt.selected = true;
    select.appendChild(opt);
Hysteroid answered 29/11, 2016 at 15:10 Comment(1)
looks simpler and worksHygrograph
E
2
// Get <select> object
var sel = $('country');

// Loop through and look for value match, then break
for(i=0;i<sel.length;i++) { if(sel.value=="ID") { break; } }

// Select index 
sel.options.selectedIndex = i;

Begitu loh.

Ergocalciferol answered 4/1, 2011 at 3:14 Comment(4)
bukan gitu maksud saya mas, pas loading Indonesia memang dah ter-select, jd di Indonesia itu harus ada tambahan attribute selected="selected", gunanya kalo optionnya dipindahin ke negara lain trus click reset, nanti balik lg ke Indonesia :DWays
Ma'af saya bule jadi tidak lancar banget, jadi mungkin pake Bahasa Inggris saja. :P @Sam katanya attribute itu cuma untuk HTML, kalo Javascript lain lagi, pake selectedIndex.Ergocalciferol
The selected='selected' attribute is usually only for HTML code. If you want to use Javascript to do this, you should be using selectedIndex. Otherwise, you could try obj.setAttribute("selected","selected").Ergocalciferol
The for loop here should be: for(i=0;i<selectBox.length;i++) { if(selectBox[i].value=="ID") { break; } } The [i] was missing, to actually look at each optionSelfhypnosis
I
2

This should work.

$("#country [value='ID']").attr("selected","selected");

If you have function calls bound to the element just follow it with something like

$("#country").change();
Inequity answered 8/2, 2014 at 17:23 Comment(0)
N
1

You could search all the option values until it finds the correct one.

var defaultVal = "Country";
$("#select").find("option").each(function () {

    if ($(this).val() == defaultVal) {

        $(this).prop("selected", "selected");
    }
});
Nucleolus answered 3/5, 2013 at 19:16 Comment(0)
H
1

Vanilla JS

Use this for Vanilla Javascript, keeping in mind that you can feed the example "numbers" array with any data from a fetch function (for example).

The initial HTML code:

<label for="the_selection">
    <select name="the_selection" id="the_selection_id">
        <!-- Empty Selection -->
    </select>
</label>

Some values select tag:

const selectionList = document.getElementById('the_selection_id');
const numbers = ['1','3','5'];

numbers.forEach(number => {
    const someOption = document.createElement('option');
    someOption.setAttribute('value', number);
    someOption.innerText = number;
    if (number == '3') someOption.defaultSelected = true;
    selectionList.appendChild(someOption);
})

You'll get:

<label for="the_selection">
    <select name="the_selection" id="the_selection_id">
        <!-- Empty Selection -->
        <option value="1">1</option>
        <option value="3" selected>3</option>
        <option value="5">5</option>
    </select>
</label>
Hallette answered 7/12, 2021 at 23:27 Comment(0)
B
1

You can solve this on ES6 like this:

var defaultValue = "ID";

[...document.getElementById('country').options].map(e => e.selected = (e.value == defaultValue));

I haven't test in other browsers but in Chrome works just fine.

...document.getElementById('country').options using the spread operator you cast options as an array.
.map allows you to apply a function to each element of your array.
e represents each <option> element of your object so you can access its attributes like .select and .value as getter and setter.
Because you .select receives a boolean option you want to assign when its value is equal to your default value.

Brunt answered 9/8, 2022 at 1:7 Comment(0)
L
0

To set the input option at run time try setting the 'checked' value. (even if it isn't a checkbox)

elem.checked=true;

Where elem is a reference to the option to be selected.

So for the above issue:

var country = document.getElementById("country");
country.options[country.options.selectedIndex].checked=true;

This works for me, even when the options are not wrapped in a .

If all of the tags share the same name, they should uncheck when the new one is checked.

Lumenhour answered 3/4, 2013 at 2:59 Comment(0)
C
0

Realize this is an old question, but with the newer version of JQuery you can now do the following:

$("option[val=ID]").prop("selected",true);

This accomplishes the same thing as Box9's selected answer in one line.

Climacteric answered 22/4, 2014 at 21:9 Comment(1)
It's option[value=ID] and not option[val=ID].Kelantan
W
0

The ideas on this page were helpful, yet as ever my scenario was different. So, in modal bootstrap / express node js / aws beanstalk, this worked for me:

var modal = $(this);
modal.find(".modal-body select#cJourney").val(vcJourney).attr("selected","selected");

Where my select ID = "cJourney" and the drop down value was stored in variable: vcJourney

Warila answered 25/6, 2018 at 10:32 Comment(0)
S
-1

I was trying something like this using the $(...).val() function, but the function did not exist. It turns out that you can manually set the value the same way you do it for an <input>:

// Set value to Indonesia ("ID"):
$('#country').value = 'ID'

...and it get's automatically updated in the select. Works on Firefox at least; you might want to try it out in the others.

Scolex answered 27/5, 2016 at 12:3 Comment(0)
Z
-1

To set value in JavaScript using set attribute , for selected option tag

var newvalue = 10;
var x = document.getElementById("optionid").selectedIndex;
    document.getElementById("optionid")[x].setAttribute('value', newvalue);
Zeebrugge answered 25/8, 2020 at 10:6 Comment(2)
Please add some explanation to your answer such that others can learn from itDermatologist
To set value in JavaScript using set attribute , for selected option tagZeebrugge

© 2022 - 2024 — McMap. All rights reserved.