Redefinir o valor select2 e mostrar o espaço reservado

212

Como definir o espaço reservado na redefinição de valor por select2. No meu exemplo Se clicamos em locais ou caixas de seleção de classificação e meu select2 tem um valor que o valor de select2 deve redefinir e mostrar o espaço reservado padrão. Este script está redefinindo o valor, mas não mostra o espaço reservado

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

Respostas:

238

Você deve definir o select2 como

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

Para redefinir o select2

$("#customers_select").select2("val", "");
AbdelMalek
fonte
7
Eu tentei isso com um <select multiple>, mas recebo o erro: A opção 'initSelection' não é permitida para Select2 quando conectado a um elemento <select>.
Sorin Postelnicu
14
Isso não funciona para mim. O espaço reservado ainda não aparece.
BCR
5
Veja a resposta do @Lego Stormtroopr abaixo, que reflete o novo método de acordo com a API da Select2. O método acima está obsoleto.
David
14
A partir da v4.0.3, não parece .select2("val", "")mais funcionar.
adamj
30
$("#customers_select").val('').trigger('change') ;Eu usei isso e funcionou.
Akshay Kulkarni
125

Select2 alterou sua API:

Select2: o select2("val")método foi descontinuado e será removido nas versões posteriores do Select2. Use $ element.val ().

A melhor maneira de fazer isso agora é:

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

Edit: December 2016 Os comentários sugerem que o seguinte é a maneira atualizada de fazer isso:

$('#your_select_input').val([]);
Hakan Fıstık
fonte
135
Isso atualiza o valor, mas, para que seja exibido corretamente, você precisará acionar um evento de alteração. $('#your_select_input').val('').trigger('change')
Saneem 24/03
5
Isso não funciona para mim. O espaço reservado ainda não aparece.
BCR
3
Isso funciona para mim com a changeadição do acionador, mas também aciona a biblioteca de validação que estamos usando - por enquanto vou ter que usar a versão reprovada.
Dave Newton
6
Isso não funciona corretamente, usando select2 4.0.2. Ele redefinirá a seleção e restaurará o espaço reservado, mas quando eu escolher um novo valor (pós-redefinição), também vejo a opção "string vazia" (ou seja, uma caixa com apenas um "x").
precisa saber é
1
$ ('# your_select_input'). val (''). trigger ('change') funciona apenas quando o espaço reservado é fornecido. caso contrário, a opção string vazia será exibida como opção selecionada.
amol
115

A resposta aceita não funciona no meu caso. Estou tentando isso e está funcionando:

Defina select2:

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

ou

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

Reiniciar:

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

ou

$("#customers_select").empty().trigger('change')
NorthCat
fonte
2
Eu achei que a menos que você tem o espaço reservado definido o allowClear não funciona
Dan Tappin
Nem $('#your_select_input').val('').trigger('change')nem $('#your_select_input').val('');funciona no Firefox
Alex Art.
1
isso funciona para mim, ele exclui todos os dados do select2 que eu estou usando v4.0.3
ClearBoth
8
$ ("# customers_select"). empty (). trigger ('change') funciona para mim. :)
Munna Khan
1
'$ ("# customers_select"). empty (). trigger (' change ')' funcionou para mim, obrigado!
Tahirhan 12/12/19
52

A única coisa que pode funcionar para mim é:

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

Estou usando a versão 4.0.3

Referência

De acordo com a documentação Select2

M.Tae
fonte
2
Também estou usando a v4.0.3 e também $('select2element').val("").trigger("change")está funcionando bem.
Roubi
Observe que você também deve ter uma <opção> vazia dentro de sua <seleção>. Se você estiver usando o ajax com select2, isso ajudará - $ ('# selectFieldId'). Prepend ('<option selected = "selected"> </option>')
musicjerm
19

Com o Select2 versão 4.0.9, isso funciona para mim:

$( "#myselect2" ).val('').trigger('change');
IlludiumPu36
fonte
1
Isso deixou meu menu suspenso select2 em branco. Trabalhou para mim. Obrigado.
disha 03/04
18

O Select2 usa uma classe CSS específica, portanto, uma maneira fácil de redefini-la é:

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

E você tem a vantagem de, se você tiver vários Select2 no mesmo formulário, todos eles serão redefinidos com este único comando.

Marcio Mazzucato
fonte
15

Usa isto :

$('.select').val([]).trigger('change');
Sachin Gend
fonte
Para mim, trabalhei com $ ('. Select2'). Val ([]). Trigger ('change');
Marcelo Agimóvel 10/01
11

PARA REMOVER O VALOR SELECIONADO

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

PARA LIMPAR OS VALORES DA OPÇÃO

$('#employee_id').html('');
Shanka SMS
fonte
1
O fefe está solicitando a redefinição do texto do espaço reservado. Portanto, apenas a primeira parte desta resposta é válida.
Nterms 6/08
2
Sim, é por isso que destaque o título das respostas.
Shanka SMS
2
A primeira resposta, de fato, não está mais sendo aplicada a partir de> 4.0. Mas a segunda opção me salvou! Esta é a solução quando você deseja realmente limpar o select2. Apenas definir o valor .val ('') para selecionar 2 não é suficiente. Você também precisa limpar o html. Muito obrigado!!!
Wazza 15/06
8

Eu sei que essa é uma pergunta antiga, mas isso funciona para a select2 versão 4.0

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

ou

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

se você tiver eventos de alteração vinculados a ele

Sean
fonte
Excelente solução. Eu tive que adicionar a função .last () para direcionar a caixa select2 recém-adicionada. $('#select2-element').last().val('').trigger('change.select2');
InsParbo
8

Use o seguinte para configurar o select2

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

E para limpar a entrada selecionada programaticamente

    $("#selectelementid").val("").trigger("change");
    $("#selectelementid").trigger("change");
Zabith Rafeek
fonte
7

Esta é a maneira correta:

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

Estou usando a versão mais recente do Select2.

TreeZ
fonte
6

Primeiramente, você deve definir select2 como este:

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

Para redefinir o select2, basta usar o seguinte bloco de código:

$("#id > option").removeAttr("selected");
$("#id").trigger("change");
Mahmut Aydın
fonte
6

Você pode limpar a seleção te

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

Mas isso não o levará de volta ao seu espaço reservado.

Então é meia solução

Rodrigo Butta
fonte
5

Eu tentei as soluções acima, mas não funcionou para mim.

Este é um tipo de hack, onde você não precisa acionar alterações.

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

ou

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

Para usuários que carregam dados remotos, isso redefinirá o select2 para o espaço reservado sem disparar o ajax. Funciona com a v4.0.3:

$("#lstProducts").val("").trigger("change.select2");
Chad Kuehn
fonte
Trabalhou para mim, mas meu gatilho era apenas 'mudança'
Gregory R. Sudderth
Esta foi a única solução que funcionou para mim para redefinir um Select2 de outro Select2 usando dados Ajax.
precisa saber é o seguinte
5

Portanto, para redefinir o formulário, alguns de vocês terão um botão de redefinição. Adicione o seguinte código dentro da tag de script

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

Ou apenas para esvaziar o campo de seleção sem manter um espaço reservado:

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

Para o espaço reservado

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

Para redefinir uma seleção 2

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

Espero que isto ajude

Rinto George
fonte
2

Seguindo a maneira recomendada de fazê-lo. Encontrado na documentação https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (este parece ser um problema bastante comum):

Quando isso acontece, geralmente significa que você não tem um espaço <option></option>em branco como primeira opção no seu <select>.

como em:

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

Eu também estava tendo esse problema e ele decorre de val(null).trigger("change");um No select2/compat/inputDataerro antes que o espaço reservado seja redefinido. Resolvi o problema capturando o erro e definindo o espaço reservado diretamente (junto com uma largura). Nota: Se você tiver mais de um, precisará capturar cada um.

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

Estou executando o Select2 4.0.3

Aba
fonte
Parece que você tem um ouvinte vinculado ao changeevento. Tente acionar change.select2- isso não acionará ouvintes vinculados (consulte github.com/select2/select2/issues/3620 ).
Paul
2

a partir da v.4.0.x ...

para limpar os valores, mas também restaurar o espaço reservado use ...

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

se estiver vazio, ele selecionará o primeiro item de opção que pode não ser o que você deseja

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

francamente ... Select2 é uma dor de bunda, me surpreende que não tenha sido substituído.

mangonights
fonte
1

Eu tentei as soluções acima, mas nenhuma funcionou com a versão 4x.

O que eu quero alcançar é: limpe todas as opções, mas não toque no espaço reservado. Este código funciona para mim.

selector.find('option:not(:first)').remove().trigger('change');
R. Canser Yanbakan
fonte
Se você usar selector.find ('option: not (: first)'). Html (''); deve funcionar.
Wazza 15/06
1

Usando select2 versão 3.2, isso funcionou para mim:

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

Não precisava implementar initSelection

tremer
fonte
1
Essa foi de longe a maneira mais simples de fazer isso. Os outros métodos não funcionaram para mim.
Chevybow # 7/18
1

Depois de tentar as 10 primeiras soluções aqui e falhar, achei que essa solução funcionava (consulte o comentário "nilov comentou em 7 de abril • editado" na página):

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

A alteração é então feita:

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

(O autor mostrou originalmente var $select = $(this[1]);, para o qual um comentarista corrigiu var $select = $(this[0]);, que mostro acima.)

guero64
fonte
1

Use este código em seu arquivo js

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

Antes de limpar o valor usando este $("#customers_select").select2("val", ""); Tente definir o foco para qualquer outro controle ao clicar em redefinir.

Isso mostrará o espaço reservado novamente.

user2243380
fonte
0

A interface DOM, já acompanha o estado inicial ...

Portanto, basta fazer o seguinte:

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

Bem, sempre que eu fazia

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

Comecei a ter algum tipo de atraso depois de três a quatro gatilhos. Suponho que haja um vazamento de memória. Não está dentro do meu código, porque se eu remover essa linha, meu aplicativo ficará sem atraso.

Como tenho as opções allowClear definidas como true, fui com

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

Isso pode ser seguido por um $ ('myselectdropdown'). Select2 ('close'); gatilho de evento no elemento select2 dom, caso você queira fechar a sugestão aberta.

Akhilesh Balachandder
fonte
0

Uma maneira [muito] hacky de fazer isso (eu vi funcionar para a versão 4.0.3):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • allowClear deve ser definido como true
  • uma opção vazia deve existir no elemento select
Ellery Iniciante
fonte
0

Minha solução é:

$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');
    });
Daniel Ortegón
fonte
0
$('myselectdropdown').select2('val', '0')

onde 0 é o seu primeiro valor do menu suspenso

Momaad Jamshed Alam
fonte