How do you remove all the options of a select box and then add one option and select it with jQuery?
Asked Answered
L

28

1231

Using core jQuery, how do you remove all the options of a select box, then add one option and select it?

My select box is the following.

<Select id="mySelect" size="9"> </Select>

EDIT: The following code was helpful with chaining. However, (in Internet Explorer) .val('whatever') did not select the option that was added. (I did use the same 'value' in both .append and .val.)

$('#mySelect').find('option').remove().end()
.append('<option value="whatever">text</option>').val('whatever');

EDIT: Trying to get it to mimic this code, I use the following code whenever the page/form is reset. This select box is populated by a set of radio buttons. .focus() was closer, but the option did not appear selected like it does with .selected= "true". Nothing is wrong with my existing code - I am just trying to learn jQuery.

var mySelect = document.getElementById('mySelect');
mySelect.options.length = 0;
mySelect.options[0] = new Option ("Foo (only choice)", "Foo");
mySelect.options[0].selected="true";

EDIT: selected answer was close to what I needed. This worked for me:

$('#mySelect').children().remove().end()
.append('<option selected value="whatever">text</option>') ;

But both answers led me to my final solution..

Lavellelaven answered 6/9, 2008 at 20:53 Comment(0)
C
1863
$('#mySelect')
    .find('option')
    .remove()
    .end()
    .append('<option value="whatever">text</option>')
    .val('whatever')
;
Cultism answered 6/9, 2008 at 21:1 Comment(8)
@nickf: I have the same problem, but I need to add a set of checkboxes rather than one on change of dropdown but my checkboxes are coming from xml. this doesn't workArchilochus
Note you could also break up the option/attr/text like: .append($("<option></option>").attr("value", '123').text('ABC!')Geier
@BrockHensley, I believe the true elegance of this answer is proper chaining in combo with the end() function. Your suggestion will work as well. From jQuery API Documentation: "Most of jQuery's DOM traversal methods operate on a jQuery object instance and produce a new one, matching a different set of DOM elements. When this happens, it is as if the new set of elements is pushed onto a stack that is maintained inside the object. Each successive filtering method pushes a new element set onto the stack. If we need an older element set, we can use end() to pop the sets back off of the stack."Succumb
this was the only way I was able to rebuild my menu and change the selected option in jQuery Mobile on PhoneGap for iOS. Refreshing the menu afterwards was also required.Beore
@BrockHensley you could even go so far as .append($("<option></option>", {'value':'123'}).text('ABC!')Kashmiri
even simple append. category.append($('<option/>', { value: Id, text: Name, selected: categoryid == Id }))Gameness
Why not $('#mySelect OPTION').remove().append('<option value="whatever">text</option>').val('whatever') ?Ecumenicity
after this I need to update selectpicker $('#mySelect').selectpicker('refresh');Cartilage
I
809
$('#mySelect')
    .empty()
    .append('<option selected="selected" value="whatever">text</option>')
;
Ionium answered 16/12, 2009 at 21:7 Comment(6)
Just out of curiosity, is 'empty' faster than 'find'? Seems like it would be -- because the 'find' would use a selector and 'empty' would just brute force empty the element.Huai
@DanEsparza I made you a jsperf; empty() turned out faster of course ;) jsperf.com/find-remove-vs-emptyOlmsted
I got a wierd glitch with this solution. The populate part of it is okay, but when I try to select a value (in my case a day), I can console log the value, but the shown value in the select field stay in the first value.... I can't resolve it:/Dime
@TakácsZsolt Maybe you should add a .val('whatever') at the end of the chain as in Matt's answer.Honna
.empty() works with materialize, whereas .remove() did not workKerosene
empty() will remove everything, even comments and find("option") will not. Just a little comment... =DCatastrophe
H
160

why not just use plain javascript?

document.getElementById("selectID").options.length = 0;
Howlyn answered 13/11, 2013 at 19:45 Comment(2)
I agree that this is the simplest solution for removing all of the options, but that only answers half of the question...Fm
Wouldn't this create a memory leak? The option elements are now inaccessible but still allocated.Indeterminism
J
111

If your goal is to remove all the options from the select except the first one (typically the 'Please pick an item' option) you could use:

$('#mySelect').find('option:not(:first)').remove();
Jahnke answered 27/3, 2013 at 9:56 Comment(2)
This should be the answer. All others intentionally removed the first with a view of recreating it afterwards, which I don't like; it also implies that they have stored the first option somewhere first too.Due
The ultimate answer, thank you!!Hammon
C
86

I had a bug in IE7 (works fine in IE6) where using the above jQuery methods would clear the select in the DOM but not on screen. Using the IE Developer Toolbar I could confirm that the select had been cleared and had the new items, but visually the select still showed the old items - even though you could not select them.

The fix was to use standard DOM methods/properites (as the poster original had) to clear rather than jQuery - still using jQuery to add options.

$('#mySelect')[0].options.length = 0;
Cladophyll answered 11/1, 2010 at 9:22 Comment(3)
I had to use this method in ie6 as well because .empty() caused my select box that was contained in a hidden container to become visible even while the parent was hidden.Tempestuous
This method also turns out to be a tiny bit (around 1%) more performant: jsperf.com/find-remove-vs-emptyOlmsted
+1 this is the most readable (in my opinion) and in jsPerf link (@Olmsted linked) the accepted answer was 34% slower (Opera 20)Carnot
N
51

Not sure exactly what you mean by "add one and select it", since it will be selected by default anyway. But, if you were to add more than one, it would make more sense. How about something like:

$('select').children().remove();
$('select').append('<option id="foo">foo</option>');
$('#foo').focus();

Response to "EDIT": Can you clarify what you mean by "This select box is populated by a set of radio buttons"? A <select> element cannot (legally) contain <input type="radio"> elements.

Nightrider answered 8/9, 2008 at 18:51 Comment(0)
S
28
$('#mySelect')
    .empty()
    .append('<option value="whatever">text</option>')
    .find('option:first')
    .attr("selected","selected")
;
Sunwise answered 3/6, 2009 at 20:48 Comment(2)
We are still using IE6 and this method did not work. However, it did work in FF 3.5.6Lavellelaven
might have to add .change() onto the end to trigger the change of selectSunwise
G
23
$("#control").html("<option selected=\"selected\">The Option...</option>");
Guy answered 30/3, 2011 at 2:30 Comment(0)
A
23

Just one line to remove all options from the select tag and after you can add any options then make second line to add options.

$('.ddlsl').empty();

$('.ddlsl').append(new Option('Select all', 'all'));

One more short way but didn't tried

$('.ddlsl').empty().append(new Option('Select all', 'all'));
Ammonal answered 17/7, 2019 at 6:29 Comment(0)
L
15

Thanks to the answers I received, I was able to create something like the following, which suits my needs. My question was somewhat ambiguous. Thanks for following up. My final problem was solved by including "selected" in the option that I wanted selected.

$(function() {
  $('#mySelect').children().remove().end().append('<option selected value="One">One option</option>') ; // clear the select box, then add one option which is selected
  $("input[name='myRadio']").filter( "[value='1']" ).attr( "checked", "checked" ); // select radio button with value 1
  // Bind click event to each radio button.
  $("input[name='myRadio']").bind("click",
                                  function() {
    switch(this.value) {
      case "1":
        $('#mySelect').find('option').remove().end().append('<option selected value="One">One option</option>') ;
        break ;
      case "2":
        $('#mySelect').find('option').remove() ;
        var items = ["Item1", "Item2", "Item3"] ; // Set locally for demo
        var options = '' ;
        for (var i = 0; i < items.length; i++) {
          if (i==0) {
            options += '<option selected value="' + items[i] + '">' + items[i] + '</option>';
          }
          else {
            options += '<option value="' + items[i] + '">' + items[i] + '</option>';
          }
        }
        $('#mySelect').html(options);   // Populate select box with array
        break ;
    } // Switch end
  } // Bind function end
                                 ); // bind end
}); // Event listener end
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>One<input  name="myRadio" type="radio" value="1"  /></label>
<label>Two<input name="myRadio"  type="radio" value="2" /></label>
<select id="mySelect" size="9"></select>
Lavellelaven answered 9/9, 2008 at 22:4 Comment(0)
S
10

I've found on the net something like below. With a thousands of options like in my situation this is a lot faster than .empty() or .find().remove() from jQuery.

var ClearOptionsFast = function(id) {
    var selectObj = document.getElementById(id);
    var selectParentNode = selectObj.parentNode;
    var newSelectObj = selectObj.cloneNode(false); // Make a shallow copy
    selectParentNode.replaceChild(newSelectObj, selectObj);
    return newSelectObj;
}

More info here.

Smutch answered 8/4, 2015 at 9:42 Comment(0)
T
9
$("#id option").remove();
$("#id").append('<option value="testValue" >TestText</option>');

The first line of code will remove all the options of a select box as no option find criteria has been mentioned.

The second line of code will add the Option with the specified value("testValue") and Text("TestText").

Torpor answered 12/10, 2018 at 9:14 Comment(1)
While this may answer the question, it would be a lot more useful if you provided an explanation as to how it answers it.Mongolia
U
8

How about just changing the html to new data.

$('#mySelect').html('<option value="whatever">text</option>');

Another example:

$('#mySelect').html('
    <option value="1" selected>text1</option>
    <option value="2">text2</option>
    <option value="3" disabled>text3</option>
');
Ulrika answered 12/11, 2014 at 11:45 Comment(0)
E
8

Building on mauretto's answer, this is a little easier to read and understand:

$('#mySelect').find('option').not(':first').remove();

To remove all the options except one with a specific value, you can use this:

$('#mySelect').find('option').not('[value=123]').remove();

This would be better if the option to be added was already there.

Enki answered 18/6, 2015 at 13:52 Comment(0)
A
8
  1. First clear all exisiting option execpt the first one(--Select--)

  2. Append new option values using loop one by one

    $('#ddlCustomer').find('option:not(:first)').remove();
    for (var i = 0; i < oResult.length; i++) {
       $("#ddlCustomer").append(new Option(oResult[i].CustomerName, oResult[i].CustomerID + '/' + oResult[i].ID));
    }
    
Aelber answered 30/9, 2015 at 6:58 Comment(0)
N
8

Another way:

$('#select').empty().append($('<option>').text('---------').attr('value',''));

Under this link, there are good practices https://api.jquery.com/select/

Nameplate answered 13/7, 2017 at 15:55 Comment(0)
D
4

This will replace your existing mySelect with a new mySelect.

$('#mySelect').replaceWith('<Select id="mySelect" size="9">
   <option value="whatever" selected="selected" >text</option>
   </Select>');
Derril answered 18/10, 2013 at 7:41 Comment(0)
C
4

Uses the jquery prop() to clear the selected option

$('#mySelect option:selected').prop('selected', false);
Chorizo answered 1/2, 2014 at 11:9 Comment(1)
.prop() only comes into effect in jQuery 1.6+. For jQuery 1.5-, use .attr()Polygynous
P
4

You can do simply by replacing html

$('#mySelect')
.html('<option value="whatever" selected>text</option>')
.trigger('change');
Philps answered 4/10, 2016 at 0:7 Comment(0)
K
4

I saw this code in Select2 - Clearing Selections

$('#mySelect').val(null).trigger('change');

This code works well with jQuery even without Select2

Kwan answered 25/1, 2019 at 6:34 Comment(0)
A
4

Cleaner give me Like it

   let data= []

   let inp = $('#mySelect')
        inp.empty()

        data.forEach(el=> inp.append(  new Option(el.Nombre, el.Id) ))
Asbestosis answered 1/2, 2022 at 19:8 Comment(0)
E
3
  • save the option values to be appended in an object
  • clear existing options in the select tag
  • iterate the list object and append the contents to the intended select tag

var listToAppend = {'':'Select Vehicle','mc': 'Motor Cyle', 'tr': 'Tricycle'};

$('#selectID').empty();

$.each(listToAppend, function(val, text) {
    $('#selectID').append( new Option(text,val) );
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Epilogue answered 3/9, 2018 at 11:17 Comment(0)
C
3

I used vanilla javascript

let select = document.getElementById("mySelect");
select.innerHTML = "";
Chitarrone answered 2/8, 2021 at 14:56 Comment(0)
H
1

Hope it will work

$('#myselect').find('option').remove()
.append($('<option></option>').val('value1').html('option1'));
Hubbub answered 23/10, 2016 at 4:6 Comment(1)
it works if more then option i cannot select the second oneEx
C
1
var select = $('#mySelect');
select.find('option').remove().end()
.append($('<option/>').val('').text('Select'));
var data = [{"id":1,"title":"Option one"}, {"id":2,"title":"Option two"}];
for(var i in data) {
    var d = data[i];
    var option = $('<option/>').val(d.id).text(d.title);
    select.append(option);
}
select.val('');
Cadena answered 19/8, 2018 at 17:22 Comment(0)
P
0

Try

$('#mySelect')
.html('<option value="whatever">text</option>')
.find('option:first')
.attr("selected","selected");

OR

$('#mySelect').html('<option value="4">Value 4</option>
 <option value="5">Value 5</option>
<option value="6">Value 6</option>
<option value="7">Value 7</option>
<option value="8">Value 8</option>')
.find('option:first')
.prop("selected",true);
Parlour answered 26/6, 2022 at 7:28 Comment(0)
B
-1

Try

mySelect.innerHTML = `<option selected value="whatever">text</option>`

function setOne() {
  console.log({mySelect});
  mySelect.innerHTML = `<option selected value="whatever">text</option>`;
}
<button onclick="setOne()" >set one</button>
<Select id="mySelect" size="9"> 
 <option value="1">old1</option>
 <option value="2">old2</option>
 <option value="3">old3</option>
</Select>
Bemused answered 3/8, 2020 at 20:57 Comment(0)
S
-1

The shortest answer:

$('#mySelect option').remove().append('<option selected value="whatever">text</option>');
Spanishamerican answered 27/6, 2021 at 8:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.