275

How do I set the placeholder on value reset by select2. In my example If locations or grade select boxes are clicked and my select2 has a value than the value of select2 should reset and show the default placeholder. This script is resetting the value but won't show the placeholder

$("#locations, #grade ").change(function() {
   $('#e6').select2('data', {
     placeholder: "Studiengang wählen",
     id: null,
     text: ''
   });
});

$("#e6").select2({
   placeholder: "Studiengang wählen",
   width: 'resolve',
   id: function(e) {
     return e.subject;
   },
   minimumInputLength: 2,
   ajax: {
     url: "index.php?option=com_unis&task=search.locator&tmpl=component&<?php echo JSession::getFormToken() ?>=1",
     dataType: 'json',
     data: function(term, page) {
       return {
         q: term, // search term
         g: $('#grade option:selected').val(),
         o: $('#locations option:selected').val()
       };
     },
     results: function(data, page) {
       return {
         results: data
       };
     }
   },
   formatResult: subjectFormatResult,
   formatSelection: subjectFormatSelection,
   dropdownCssClass: "bigdrop",
   escapeMarkup: function(m) {
     return m;
   }
});
2
  • Just refer to the Documentation instead of using weird suggestions which wont work from this or other SO threads. The suggested approach by Select2 is: $('#mySelect2').val(null).trigger('change');. Reference: select2.org/programmatic-control/add-select-clear-items. And that works like a charm.
    – user3934058
    Commented Aug 25, 2021 at 7:46
  • incase if any one needs full implementation with ajax codepen.io/ashgadala/pen/NWOxBze
    – Avi
    Commented Apr 13, 2023 at 23:06

46 Answers 46

260

You must define the select2 as

$("#customers_select").select2({
    placeholder: "Select a customer",
    initSelection: function(element, callback) {                   
    }
});

To reset the select2

$("#customers_select").select2("val", "");
12
  • 8
    I tried this with a <select multiple>, but I get the error: Option 'initSelection' is not allowed for Select2 when attached to a <select> element. Commented Dec 12, 2014 at 11:36
  • 19
    This does not work for me. The placeholder still does not show up.
    – bcr
    Commented May 4, 2015 at 19:41
  • 5
    See @Lego Stormtroopr's answer below, which reflects the new method according to Select2's API. The above method is deprecated.
    – David
    Commented Mar 4, 2016 at 2:22
  • 16
    As of v4.0.3, it doesn't seem like .select2("val", "") works anymore.
    – adamj
    Commented Aug 6, 2016 at 13:45
  • 62
    $("#customers_select").val('').trigger('change') ; I used this and it worked. Commented Feb 23, 2018 at 12:28
206

The accepted answer does not work in my case. I'm trying this, and it's working:

Define select2:

$("#customers_select").select2({
    placeholder: "Select a State",
    allowClear: true
});

or

$("#customers_select").select2({
    placeholder: "Select a State"
});

To reset:

$("#customers_select").val('').trigger('change')

or

$("#customers_select").empty().trigger('change')
11
  • 2
    I found that unless you have the placeholder defined the allowClear does not work
    – Dan Tappin
    Commented Jul 26, 2016 at 20:23
  • Neither $('#your_select_input').val('').trigger('change') nor $('#your_select_input').val(''); doesn't work in Firefox
    – Alex Art.
    Commented Oct 11, 2016 at 18:36
  • 2
    this works for me, it deletes all data from the select2 I'm using v4.0.3
    – ClearBoth
    Commented Jan 26, 2017 at 7:15
  • 13
    $("#customers_select").empty().trigger('change') works for me. :)
    – Munna Khan
    Commented Mar 7, 2017 at 19:57
  • 2
    '$("#customers_select").empty().trigger('change')' worked for me, thanks!
    – Tahirhan
    Commented Dec 12, 2019 at 8:29
134

Select2 has changed their API:

Select2: The select2("val") method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.

The best way to do this now is:

$('#your_select_input').val('');

Edit: December 2016 Comments suggest that the below is the updated way to do this:

$('#your_select_input').val([]);
14
  • 146
    This updates the value, but for it to show up correctly, you'll have to trigger a change event. $('#your_select_input').val('').trigger('change')
    – Saneem
    Commented Mar 24, 2015 at 7:36
  • 5
    This does not work for me. The placeholder still does not show up.
    – bcr
    Commented May 4, 2015 at 19:41
  • 4
    This works for me with the change trigger addition, but also triggers the validation library we're using--for now I'll have to use the deprecated version. Commented Jun 2, 2015 at 21:12
  • 6
    This does not work correctly, using select2 4.0.2. It will reset the selection and restore the placeholder, but when I choose a new value (post reset), I also see selected an "empty string" option (i.e., a box with only an "x" in it).
    – kounoupis
    Commented Mar 4, 2016 at 16:14
  • 1
    $('#your_select_input').val('').trigger('change') works only when placeholder is provided. else empty string option will be displayed as selected option.
    – A_0
    Commented Jun 14, 2016 at 9:44
68

The only thing can work for me is:

$('select2element').val(null).trigger("change")

I'm using version 4.0.3

Reference

According to Select2 Documentation

2
  • 2
    I'm also using v4.0.3 and $('select2element').val("").trigger("change") is working fine too.
    – Roubi
    Commented May 24, 2017 at 18:38
  • Please note that you must also have an empty <option> inside your <select>. If you are using ajax with select2, this will help - $('#selectFieldId').prepend('<option selected="selected"></option>')
    – musicjerm
    Commented Feb 17, 2020 at 21:20
45

With Select2 version 4.0.9 this works for me:

$( "#myselect2" ).val('').trigger('change');
2
  • 1
    This made my select2 dropdown blank. Worked for me. Thanks.
    – disha
    Commented Apr 3, 2020 at 11:33
  • Worked for me for version 4.0.13 Commented Feb 16, 2022 at 14:28
19

Select2 uses a specific CSS class, so an easy way to reset it is:

$('.select2-container').select2('val', '');

And you have the advantage of if you have multiple Select2 at the same form, all them will be reseted with this single command.

0
18

I know this is kind of an old question, but this works for the select2 version 4.0

 $('#select2-element').val('').trigger('change');

or

$('#select2-element').val('').trigger('change.select2'); 

if you have change events bound to it

1
  • 1
    Excellent solution. I had to add .last() function to target the newly added select2 box. $('#select2-element').last().val('').trigger('change.select2');
    – InsParbo
    Commented Nov 23, 2017 at 0:22
17

Use this :

$('.select').val([]).trigger('change');
2
  • For me, worked with $('.select2').val([]).trigger('change'); Commented Jan 10, 2018 at 12:22
  • I've tried all the suggestions above but none worked for me. This is worked perfectly for me. thanks!
    – user752746
    Commented Jul 28, 2022 at 21:36
15

TO REMOVE SELECTED VALUE

$('#employee_id').select2('val','');

TO CLEAR OPTION VALUES

$('#employee_id').html('');
4
  • 1
    fefe is asking for re-setting the placeholder text. So only the first part of this answer is valid.
    – Saranga A
    Commented Aug 6, 2015 at 11:38
  • 2
    Yes that's why i highlight the answers title.
    – Shanka SMS
    Commented Oct 14, 2015 at 7:31
  • 2
    The first answer indeed it isn't applying anymore from >4.0. But the second option saved me! This is the solution when you want to really clear the select2. Just setting the .val('') to select 2 it isn't enough. You need also to clear the html. Thanks a lot!!!
    – wazza
    Commented Jun 15, 2017 at 12:12
  • any way thanks @ShankaSMS I was looking for solution to reset and rebind the data to select2
    – Aung Aung
    Commented Dec 6, 2020 at 15:52
9

This is the correct way:

 $("#customers_select").val('').trigger('change');

I am using the latest release of Select2.

8

I tried the above solutions but it didn't work for me.

This is kind of hack, where you do not have to trigger change.

$("select").select2('destroy').val("").select2();

or

$("select").each(function () { //added a each loop here
        $(this).select2('destroy').val("").select2();
});
1
  • I modified to something like in my implementation: $("#select").on('change', function () { $(this).val("").select2(); }); Commented Apr 15, 2021 at 20:36
8

Use following to configure select2

    $('#selectelementid').select2({
        placeholder: "Please select an agent",
        allowClear: true // This is for clear get the clear button if wanted 
    });

And to clear select input programmatically

    $("#selectelementid").val("").trigger("change");
    $("#selectelementid").trigger("change");
6

Firstly you must define select2 like this:

$('#id').select2({
    placeholder: "Select groups...",
    allowClear: true,
    width: '100%',
})

To reset select2, simply you may use the following code block:

$("#id > option").removeAttr("selected");
$("#id").trigger("change");
6

You can clear te selection by

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

But it wont turn you back to your placeholder.

So its a half solution

0
5

For users loading remote data, this will reset the select2 to the placeholder without firing off ajax. Works with v4.0.3:

$("#lstProducts").val("").trigger("change.select2");
2
  • Worked for me but my trigger was just 'change' Commented Aug 3, 2017 at 18:38
  • This was the only solution that worked for me to reset a Select2 from another Select2 using Ajax data. Commented Aug 27, 2019 at 2:41
5

So, to reset the form some of you will have a reset button. Add the following code inside the script tag

$('.your_btn_class').click(function(){
    $('#select_field_id').val([]);
    $("#select_field_id").select2({
    placeholder: "this is a placeholder",
    });
});

Or just to empty select field without keeping a placeholder:

$('.your_btn_class').click(function(){
    $('#select_field_id').val([]);
 });
3

as of v.4.0.x...

to clear the values, but also restore the placeholder use...

.html('<option></option>');  // defaults to placeholder

if it's empty, it will select the first option item instead which may not be what you want

.html(''); // defaults to whatever item is first

frankly...Select2 is such a pain in the butt, it amazes me it hasn't been replaced.

3

For the place holder

$("#stateID").select2({
    placeholder: "Select a State"
});

To reset a select 2

$('#stateID').val('');
$('#stateID').trigger('change');

Hope this helps

3

From select2 website,

$("#mySelect2ControlId").val(null).trigger("change");
2

Following the recommended way of doing it. Found in the documentation https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (this seems to be a fairly common issue):

When this happens it usually means that you do not have a blank <option></option> as the first option in your <select>.

as in:

<select>
   <option></option>
   <option value="foo">your option 1</option>
   <option value="bar">your option 2</option>
   <option value="etc">...</option>
</select>
2

I have tried above solutions but none worked with version 4x.

What i want to achieve is: clear all options but don't touch the placeholder. This code works for me.

selector.find('option:not(:first)').remove().trigger('change');
1
  • If you use selector.find('option:not(:first)').html(''); it should work.
    – wazza
    Commented Jun 15, 2017 at 12:15
2

I was also having this problem and it stems from val(null).trigger("change"); throwing a No select2/compat/inputData error before the placeholder gets reset. I solved it by catching the error and setting the placeholder directly (along with a width). Note: If you have more than one you will need to catch each one.

try{
    $("#sel_item_ID").select2().val(null).trigger("change");
}catch(err){
    console.debug(err)
}
try{
    $("#sel_location_ID").select2().val(null).trigger("change");
}catch(err){
    console.debug(err)
}
$('.select2-search__field')[0].placeholder='All Items';
$('.select2-search__field')[1].placeholder='All Locations';
$('.select2-search__field').width(173);

I'm running Select2 4.0.3

1
  • It sounds like you have a listener bound to the change event. Try triggering change.select2 - that won't trigger bound listeners (see github.com/select2/select2/issues/3620).
    – Paul
    Commented Mar 23, 2017 at 17:28
2

After trying the first 10 solutions here and failing, I found this solution to work (see "nilov commented on Apr 7 • edited" comment down the page):

(function ($) {
   $.fn.refreshDataSelect2 = function (data) {
       this.select2('data', data);

       // Update options
       var $select = $(this[0]);
       var options = data.map(function(item) {
           return '<option value="' + item.id + '">' + item.text + '</option>';
       });
       $select.html(options.join('')).change();
   };
})(jQuery);

The change is then made:

var data = [{ id: 1, text: 'some value' }];
$('.js-some-field').refreshDataSelect2(data);

(The author originally showed var $select = $(this[1]);, which a commenter corrected to var $select = $(this[0]);, which I show above.)

1
  • this is the only one that worked for me... years later Commented Mar 16, 2021 at 7:30
2

Use this code into your js file

$('#id').val('1');
$('#id').trigger('change');
2
$("#customers_select").val([]).trigger('change')

this will remove values AND most important for me - it also remove an empty x button

0
2

This is working snippet for latest select 2 api.

Reset or Clear select2 input.

$("#selector").val([]).trigger('change');

i.e.

$( ".reset" ).on('click',function(){
    $(".select2input").val([]).trigger('change');
});
2

Admin lte 3 with Select2.

After a lot of tries this is what worked for me :

Library at the top ( Modify position if it's conflicting with the bootstrap )

<link rel="stylesheet" href="/template/almasaeed2010/adminlte/plugins/select2/css/select2.min.css" >
<link rel="stylesheet" href="/template/almasaeed2010/adminlte/plugins/select2-bootstrap4-theme/select2-bootstrap4.min.css" >

JS scripts ( After JQuery and before your .select2(... script )

<script src="/template/almasaeed2010/adminlte/plugins/select2/js/select2.full.min.js"></script>

HTML

<select name="mode_de_reglement" id="mode_de_reglement" >
     <option value="cheque">cheque</option>
     <option value="virement">virement</option>
     <option value="carte_bancaire">carte bancaire</option>
</select>

Initialization script :

$("#mode_de_reglement").select2({
     placeholder : "Mode de réglement"
});
$('#mode_de_reglement').val('');//setting starting value to empty because by default it selects the first value
$('#mode_de_reglement').trigger('change');//change to let the select2 library know you modified the value programmatically

Finally whenever the form gets reopened i refresh the select again using :

//... onclick="openModalNewRecord()"
$('#mode_de_reglement').val('');
$('#mode_de_reglement').trigger('change');

Here is the template i used AdminLte3

Also note that you can create select2 using

$("#mode_de_reglement").select2({
     placeholder : "Mode de réglement" ,
     allowClear : true 
});

Allow clear adds an X button to clear selection and show placeholder , but i don't use it unless that field is nullable in the database.

1
  • Note: Don't forget to set style="width: 100% ;" or the select 2 will be collapsed ! Commented Apr 28, 2022 at 21:57
2
$(your_id_or_class).select2("data",null);

This will actually clear it without adding a new blank option, making the select2 field clearable, or triggering any callbacks from the change. It behaves the most like a true reset of the dropdown.

1
  • 2
    Your answer could be improved by adding more information on what the code does and how it helps the OP.
    – Tyler2P
    Commented Mar 29, 2023 at 18:32
1

Well whenever I did

$('myselectdropdown').select2('val', '').trigger('change');

I started getting some kind of lag after some three to four triggers. I suppose there's a memory leak. Its not within my code because if I do remove the this line, my app is lag free.

Since I have allowClear options set to true, I went with

$('.select2-selection__clear').trigger('mousedown');

This can be followed by a $('myselectdropdown').select2('close'); event trigger on the select2 dom element in case you wanna close the open suggestion drop down.

1

Using select2 version 3.2 this worked for me:

$('#select2').select2("data", "");

Didn't need to implement initSelection

1
  • 1
    This was by far the simplest way for me to do it. The other methods did not work for me.
    – chevybow
    Commented Sep 7, 2018 at 18:35

Not the answer you're looking for? Browse other questions tagged or ask your own question.