Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clear dropdown using jQuery Select2

I'm trying to programmatically clear a drop down using the fantastic Select2 library. The drop down is dynamically filled with a remote ajax call using the Select2 query option.

HTML:

<input id="remote" type="hidden" data-placeholder="Choose Something" />

Javascript:

        var $remote = $('#remote');

        $remote.select2({
            allowClear: true,
            minimumInputLength: 2,
            query: function(options){
                $.ajax({
                    dataType: 'json',
                    url: myURL + options.term,
                    error: function(jqXHR, textStatus, errorThrown){
                        smoke.alert(textStatus + ": server returned error on parsing arguments starting with " + options.term);
                    },
                    success: function(data, textStatus, jqXHR){
                        var results = [];
                        for(var i = 0; i < data.length; ++i){
                            results.push({id: data[i].id, text: data[i].name});
                        }

                        options.callback({results: results, more: false});
                    }
                });
            }
        });

Unfortunately, the call to $remove.select2('val', '') throws the following exception:

 Uncaught Error: cannot call val() if initSelection() is not defined

I've tried setting the attr, setting the val, text and the Select2 specific data function. Can't seem to make the guy clear and work in a radio button like manner. Anyone got suggestions?

like image 900
wheaties Avatar asked Nov 05 '12 20:11

wheaties


People also ask

How do I empty select2?

In order to clear the selection of those values which are selected using a Select2 drop down,we can use the empty() function. The dropdown can be reset using Jquery. $("#select2_example"). empty();

How do I select a specific Dropdownlist using jQuery?

Syntax of jQuery Select Option $(“selector option: selected”); The jQuery select option is used to display selected content in the option tag. text syntax is below: var variableValue = $(“selector option: selected”).

What select2 dropdown?

By default, Select2 will attach the dropdown to the end of the body and will absolutely position it to appear above or below the selection container. Select2 will display the dropdown above the container if there is not enough space below the container, but there is enough space above it.


14 Answers

This works for me:

 $remote.select2('data', {id: null, text: null})

It also works with jQuery validate when you clear it that way.

-- edit 2013-04-09

At the time of writing this response, it was the only way. With recent patches, a proper and better way is now available.

$remote.select2('data', null)
like image 163
Maktouch Avatar answered Oct 06 '22 06:10

Maktouch


In case of Select2 Version 4+

it has changed syntax and you need to write like this:

// clear all option
$('#select_with_blank_data').html('').select2({data: [{id: '', text: ''}]});

// clear and add new option
$("#select_with_data").html('').select2({data: [
 {id: '', text: ''},
 {id: '1', text: 'Facebook'},
 {id: '2', text: 'Youtube'},
 {id: '3', text: 'Instagram'},
 {id: '4', text: 'Pinterest'}]});
like image 30
Sruit A.Suk Avatar answered Oct 06 '22 08:10

Sruit A.Suk


This is the proper one, select2 will clear the selected value and show the placeholder back .

$remote.select2('data', null)
like image 40
Dewey Avatar answered Oct 06 '22 06:10

Dewey


For select2 version 4 easily use this:

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

After populating select element with ajax call, you may need this line of code in the success section to update the content:

  success: function(data, textStatus, jqXHR){
  $('#remote').change();
                } 
like image 26
Amin Avatar answered Oct 06 '22 06:10

Amin


Using select2 version 4 you can use this short notation:

$('#remote').html('').select2({data: {id:null, text: null}});

This passes a json array with null id and text to the select2 on creation but first, with .html('') empties the previously stored results.

like image 44
Lelio Faieta Avatar answered Oct 06 '22 08:10

Lelio Faieta


You should use this one :

   $('#remote').val(null).trigger("change");
like image 39
JackWang Avatar answered Oct 06 '22 08:10

JackWang


Method proposed @Lelio Faieta is working for me, but because i use bootstrap theme, it remove all bootstrap settings for select2. So I used following code:

$("#remote option").remove();
like image 42
Viktor Shatilo Avatar answered Oct 06 '22 07:10

Viktor Shatilo


I'm a little late, but this is what's working in the last version (4.0.3):

$('#select_id').val('').trigger('change');
like image 22
Andres SK Avatar answered Oct 06 '22 07:10

Andres SK


This solved my problem in version 3.5.2.

$remote.empty().append(new Option()).trigger('change');

According to this issue you need an empty option inside select tag for the placeholder to show up.

like image 25
Michał Szymański Avatar answered Oct 06 '22 06:10

Michał Szymański


These both work for me to clear the dropdown:

.select2('data', null)
.select2('val', null)

But important note: value doesn't get reset, .val() will return the first option even if it's not selected. I'm using Select2 3.5.3

like image 21
realplay Avatar answered Oct 06 '22 07:10

realplay


I found the answer (compliments to user780178) I was looking for in this other question:

Reset select2 value and show placeholdler

$("#customers_select").select2("val", "");
like image 27
Aegix Avatar answered Oct 06 '22 07:10

Aegix


From >4.0 in order to really clean the select2 you need to do the following:

$remote.select2.val('');
$remote.select2.html('');
selectedValues = []; // if you have some variable where you store the values
$remote.select2.trigger("change");

Please note that we select the select2 based on the initial question. In your case most probably you will select the select2 in a different way.

Hope it helps.

like image 24
wazza Avatar answered Oct 06 '22 08:10

wazza


For Ajax, use $(".select2").val("").trigger("change"). That should solve the issue.

like image 23
Sam San Avatar answered Oct 06 '22 08:10

Sam San


this code remove all results for showing new list if you need:

$('#select2Elem').data('select2').$results.children().remove()

For example, in the list of provinces and cities, when the province changes and we click on the city input, the list of old cities is still displayed until the new list is loaded.

With the code I wrote, you can delete the old list before calling ajax

like image 39
Omid-RH Avatar answered Oct 06 '22 08:10

Omid-RH