Zresetuj wartość select2 i pokaż symbol zastępczy


212

Jak ustawić symbol zastępczy na resetowanie wartości przez select2. W moim przykładzie Jeśli kliknięto pola wyboru lokalizacji lub oceny, a mój select2 ma wartość niż wartość select2 powinien zresetować i pokazać domyślny symbol zastępczy. Ten skrypt resetuje wartość, ale nie wyświetla symbolu zastępczego

$("#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;
   }
});

Odpowiedzi:


238

Musisz zdefiniować select2 jako

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

Aby zresetować select2

$("#customers_select").select2("val", "");

7
Próbowałem tego z <select multiple>, ale pojawia się błąd: Opcja „initSelection” nie jest dozwolona dla Select2, gdy jest dołączony do elementu <select>.
Sorin Postelnicu,

15
To mi nie działa. Symbol zastępczy nadal się nie wyświetla.
bcr

5
Zobacz odpowiedź @Lego Stormtroopr poniżej, która odzwierciedla nową metodę zgodną z API Select2. Powyższa metoda jest przestarzała.
David

14
Począwszy od wersji 4.0.3, nie wydaje się, że .select2("val", "")działa.
adamj

31
$("#customers_select").val('').trigger('change') ;Użyłem tego i zadziałało.
Akshay Kulkarni

125

Select2 zmieniło swój interfejs API:

Select2: select2("val")Metoda została wycofana i zostanie usunięta w późniejszych wersjach Select2. Zamiast tego użyj $ element.val ().

Najlepszym sposobem na zrobienie tego teraz jest:

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

Edycja: grudzień 2016 Komentarze sugerują, że poniżej jest zaktualizowany sposób to zrobić:

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

136
To aktualizuje wartość, ale aby wyświetlała się poprawnie, musisz wywołać zdarzenie zmiany. $('#your_select_input').val('').trigger('change')
Saneem

5
To mi nie działa. Symbol zastępczy nadal się nie wyświetla.
bcr

3
Działa to dla mnie z changedodawaniem wyzwalacza, ale także wyzwala bibliotekę sprawdzania poprawności, której używamy - na razie będę musiał użyć przestarzałej wersji.
Dave Newton

6
To nie działa poprawnie, używając select2 4.0.2. Zresetuje zaznaczenie i przywróci symbol zastępczy, ale kiedy wybieram nową wartość (po resecie), widzę również wybraną opcję „pusty ciąg” (tj. Pole zawierające tylko „x”).
kounoupis

1
$ ('# your_select_input'). val (''). trigger ('change') działa tylko wtedy, gdy podany jest symbol zastępczy. w przeciwnym razie opcja pustego ciągu będzie wyświetlana jako wybrana opcja.
amol

116

Przyjęta odpowiedź nie działa w moim przypadku. Próbuję tego i działa:

Zdefiniuj select2:

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

lub

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

Zresetować:

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

lub

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

2
Odkryłem, że jeśli nie masz zdefiniowanego symbolu zastępczego, allowClear nie działa
Dan Tappin

Ani $('#your_select_input').val('').trigger('change'), ani $('#your_select_input').val('');nie działa w Firefoksie
Alex art.

1
to działa dla mnie, usuwa wszystkie dane z select2 Używam v4.0.3
ClearBoth

8
$ („# customer_select”). empty (). trigger („zmiana”) działa dla mnie. :)
Munna Khan,

1
„$ („ # customer_select ”). empty (). trigger („ change ”)” działało dla mnie, dzięki!
Tahirhan,

52

Jedyne, co może dla mnie zadziałać, to:

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

Używam wersji 4.0.3

Odniesienie

Zgodnie z dokumentacją Select2


2
Używam również wersji 4.0.3 i też $('select2element').val("").trigger("change")działa dobrze.
Roubi

Pamiętaj, że musisz także mieć pustą <opcję> w swoim <select>. Jeśli używasz ajax z select2, to pomoże - $ ('# selectFieldId'). Prepend ('<option selected = "selected"> </option>')
musicjerm

20

W przypadku Select2 w wersji 4.0.9 działa to dla mnie:

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

1
To sprawiło, że moja lista rozwijana select2 była pusta. Pracował dla mnie. Dzięki.
disha

18

Select2 używa określonej klasy CSS, więc łatwym sposobem na jej zresetowanie jest:

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

Masz tę zaletę, że jeśli masz wiele Select2 w tej samej formie, wszystkie zostaną zresetowane za pomocą tego pojedynczego polecenia.



11

ABY USUNĄĆ WYBRANĄ WARTOŚĆ

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

ABY WYCZYŚĆ WARTOŚCI OPCJI

$('#employee_id').html('');

1
fefe prosi o ponowne ustawienie tekstu zastępczego. Tak więc ważna jest tylko pierwsza część tej odpowiedzi.
nterms

2
Tak, dlatego podkreślam tytuł odpowiedzi.
Shanka SMS

2
Pierwsza odpowiedź rzeczywiście nie ma zastosowania od> 4.0. Ale druga opcja mnie uratowała! Jest to rozwiązanie, gdy chcesz naprawdę wyczyścić select2. Wystarczy ustawić .val (''), aby wybrać 2, to nie wystarczy. Musisz także wyczyścić HTML. Wielkie dzięki!!!
wazza

9

Wiem, że to trochę stare pytanie, ale działa to w przypadku select2 w wersji 4.0

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

lub

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

jeśli masz związane z tym zdarzenia


Doskonałe rozwiązanie Musiałem dodać funkcję .last (), aby celować w nowo dodane pole select2. $('#select2-element').last().val('').trigger('change.select2');
InsParbo,

8

Użyj poniższych, aby skonfigurować select2

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

I programowo wyczyścić wybrane dane wejściowe

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

8

To jest właściwy sposób:

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

Korzystam z najnowszej wersji Select2.


6

Najpierw musisz zdefiniować select2 w następujący sposób:

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

Aby zresetować select2, możesz po prostu użyć następującego bloku kodu:

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

6

Możesz wyczyścić wybór poprzez

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

Ale to nie sprawi, że wrócisz do swojego symbolu zastępczego.

Więc to połowa rozwiązania


5

Próbowałem powyższych rozwiązań, ale to nie działało dla mnie.

Jest to rodzaj włamania, w którym nie musisz inicjować zmian.

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

lub

$("select").each(function () { //added a each loop here
        $(this).select2('destroy').val("").select2();
});

5

Dla użytkowników ładujących dane zdalne spowoduje to zresetowanie select2 do symbolu zastępczego bez odpalania ajax. Działa z wersją 4.0.3:

$("#lstProducts").val("").trigger("change.select2");

Pracował dla mnie, ale moim wyzwalaczem była po prostu „zmiana”
Gregory R. Sudderth,

To było jedyne rozwiązanie, które działało dla mnie, aby zresetować Select2 z innego Select2 przy użyciu danych Ajax.
IlludiumPu36

5

Aby zresetować formularz, niektórzy z was będą mieli przycisk resetowania. Dodaj następujący kod do znacznika skryptu

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

Lub po prostu opróżnij pole wyboru bez zachowania symbolu zastępczego:

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

3

Dla posiadacza miejsca

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

Aby zresetować wybierz 2

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

Mam nadzieję że to pomoże


2

Zgodnie z zalecanym sposobem robienia tego. Znalezione w dokumentacji https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (wydaje się, że jest to dość powszechny problem):

Kiedy tak się dzieje, zwykle oznacza to, że nie masz spacji <option></option>jako pierwszej opcji w twoim <select>.

jak w:

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

2

Miałem również ten problem i wynika on z val(null).trigger("change");rzucenia No select2/compat/inputDatabłędu przed zresetowaniem symbolu zastępczego. Rozwiązałem go, wychwytując błąd i ustawiając symbol zastępczy bezpośrednio (wraz z szerokością). Uwaga: jeśli masz więcej niż jeden, musisz złapać każdego z nich.

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);

Korzystam z Select2 4.0.3


Wygląda na to, że słuchacz jest związany ze changezdarzeniem. Spróbuj wyzwalać change.select2- to nie wyzwoli powiązanych słuchaczy (zobacz github.com/select2/select2/issues/3620 ).
Paul

2

od wersji 4.0.x ...

aby usunąć wartości, ale także przywrócić użycie symbolu zastępczego ...

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

jeśli jest pusty, zamiast tego wybierze pierwszy element opcji, który może nie być tym, czego chcesz

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

szczerze mówiąc ... Select2 to taki ból w tyłku, zadziwia mnie, że nie został zastąpiony.


1

Próbowałem powyższych rozwiązań, ale żadne nie działało z wersją 4x.

Chcę osiągnąć: wyczyść wszystkie opcje, ale nie dotykaj symbolu zastępczego. Ten kod działa dla mnie.

selector.find('option:not(:first)').remove().trigger('change');

Jeśli użyjesz selector.find ('opcja: not (: first)'). Html (''); powinno działać.
wazza

1

Przy użyciu wersji select2 3.2 zadziałało to dla mnie:

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

Nie musiałem wdrażać initSelection


1
To był dla mnie najprostszy sposób. Inne metody nie działały dla mnie.
chevybow

1

Po wypróbowaniu pierwszych 10 rozwiązań i niepowodzenia, znalazłem to rozwiązanie, które zadziałało (patrz: „komentarz Nilov do 7 kwietnia • edytowany” komentarz w dół strony):

(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);

Następnie dokonuje się zmiany:

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

(Autor pierwotnie pokazał var $select = $(this[1]);, do którego poprawił komentator, co pokazałem var $select = $(this[0]);powyżej).


1

Użyj tego kodu w pliku js

$('#id').val('1');
$('#id').trigger('change');

0

Zanim wyczyścisz tę wartość, $("#customers_select").select2("val", ""); spróbuj ustawić fokus na dowolnym innym elemencie sterującym po kliknięciu resetowania.

Spowoduje to ponowne wyświetlenie symbolu zastępczego.


0

Interfejs DOM już śledzi stan początkowy ...

Wystarczy więc wykonać następujące czynności:

$("#reset").on("click", function () {
    $('#my_select option').prop('selected', function() {
        return this.defaultSelected;
    });
});

0

Cóż, kiedykolwiek to zrobiłem

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

Zacząłem mieć jakieś opóźnienie po około trzech do czterech wyzwalaczy. Przypuszczam, że wyciek pamięci. Nie ma go w moim kodzie, ponieważ jeśli usunę ten wiersz, moja aplikacja będzie wolna od opóźnień.

Ponieważ mam ustawione na true opcje allowClear, poszedłem z

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

Po tym może nastąpić $ („myselectdropdown”). Select2 („close”); wyzwalacz zdarzenia na elemencie select2 dom, na wypadek gdybyś chciał zamknąć rozwijaną listę sugestii.


0

Jeden [bardzo] hacky sposób, aby to zrobić (widziałem, że działa w wersji 4.0.3):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • allowClear musi być ustawione na true
  • w elemencie select musi istnieć pusta opcja

0

Moje rozwiązanie to:

$el.off('select2:unselect')
$el.on('select2:unselect', function (event) {
    var $option = $('<option value="" selected></option>');
    var $selected = $(event.target);

    $selected.find('option:selected')
             .remove()
             .end()
             .append($option)
             .trigger('change');
    });

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.