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

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

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

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

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


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

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.



11

PARA REMOVER O VALOR SELECIONADO

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

PARA LIMPAR OS VALORES DA OPÇÃO

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

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


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

7

Esta é a maneira correta:

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

Estou usando a versão mais recente do Select2.


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

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


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

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

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([]);
 });

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


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>

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


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.


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

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


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


1

Use este código em seu arquivo js

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

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.


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

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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.