Restablezca el valor de select2 y muestre el marcador de posición

212

¿Cómo configuro el marcador de posición para restablecer el valor con select2? En mi ejemplo, si se hace clic en ubicaciones o en cuadros de selección de calificación y mi select2 tiene un valor que el valor de select2 debería restablecerse y mostrar el marcador de posición predeterminado. Este script restablece el valor pero no muestra el marcador de posición

$("#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
fuente

Respuestas:

238

Debe definir select2 como

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

Para restablecer el select2

$("#customers_select").select2("val", "");
AbdelMalek
fuente
77
Intenté esto con un <select multiple>, pero recibo el error: la opción 'initSelection' no está permitida para Select2 cuando está asociada a un elemento <select>.
Sorin Postelnicu
14
Esto no funciona para mi. El marcador de posición aún no aparece.
bcr
55
Consulte la respuesta de @Lego Stormtroopr a continuación, que refleja el nuevo método de acuerdo con la API de Select2. El método anterior está en desuso.
David
14
A partir de v4.0.3, ya no parece que .select2("val", "")funcione.
adamj
30
$("#customers_select").val('').trigger('change') ;Usé esto y funcionó.
Akshay Kulkarni
125

Select2 ha cambiado su API:

Select2: el select2("val")método ha quedado en desuso y se eliminará en versiones posteriores de Select2. Use $ element.val () en su lugar.

La mejor manera de hacer esto ahora es:

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

Edición: diciembre de 2016 Los comentarios sugieren que la siguiente es la forma actualizada de hacer esto:

$('#your_select_input').val([]);
Hakan Fıstık
fuente
135
Esto actualiza el valor, pero para que se muestre correctamente, deberá activar un evento de cambio. $('#your_select_input').val('').trigger('change')
Saneem
55
Esto no funciona para mi. El marcador de posición aún no aparece.
bcr
3
Esto funciona para mí con la changeadición del activador, pero también activa la biblioteca de validación que estamos usando, por ahora tendré que usar la versión obsoleta.
Dave Newton
66
Esto no funciona correctamente, usando select2 4.0.2. Restablecerá la selección y restaurará el marcador de posición, pero cuando elijo un nuevo valor (después del restablecimiento), también veo seleccionada una opción de "cadena vacía" (es decir, un cuadro con solo una "x").
kounoupis
1
$ ('# your_select_input'). val (''). trigger ('change') solo funciona cuando se proporciona un marcador de posición. de lo contrario, la opción de cadena vacía se mostrará como opción seleccionada.
amol
115

La respuesta aceptada no funciona en mi caso. Estoy intentando esto, y está funcionando:

Definir select2:

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

o

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

Reiniciar:

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

o

$("#customers_select").empty().trigger('change')
NorthCat
fuente
2
Descubrí que, a menos que haya definido el marcador de posición, allowClear no funciona
Dan Tappin
Ni $('#your_select_input').val('').trigger('change')tampoco $('#your_select_input').val('');funciona en Firefox
Alex Art.
1
esto funciona para mí, elimina todos los datos de select2 que estoy usando v4.0.3
ClearBoth
8
$ ("# clients_select"). empty (). trigger ('change') funciona para mí. :)
Munna Khan
1
'$ ("# clients_select"). empty (). trigger (' change ')' funcionó para mí, ¡gracias!
Tahirhan
52

Lo único que puede funcionar para mí es:

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

Estoy usando la versión 4.0.3

Referencia

De acuerdo con la documentación de Select2

M.Tae
fuente
2
También estoy usando v4.0.3 y también $('select2element').val("").trigger("change")funciona bien.
Roubi
Tenga en cuenta que también debe tener una <opción> vacía dentro de su <seleccionar>. Si está utilizando ajax con select2, esto ayudará - $ ('# selectFieldId'). Prepend ('<option selected = "selected"> </option>')
musicjerm
19

Con Select2 versión 4.0.9 esto funciona para mí:

$( "#myselect2" ).val('').trigger('change');
IlludiumPu36
fuente
1
Esto hizo que mi menú desplegable select2 en blanco. Trabajó para mi. Gracias.
disha
18

Select2 usa una clase CSS específica, por lo que una manera fácil de restablecerla es:

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

Y tiene la ventaja de que si tiene múltiples Select2 en la misma forma, todos se restablecerán con este solo comando.

Marcio Mazzucato
fuente
15

Utilizar este :

$('.select').val([]).trigger('change');
Sachin Gend
fuente
Para mí, trabajé con $ ('. Select2'). Val ([]). Trigger ('change');
Marcelo Agimóvel
11

PARA ELIMINAR EL VALOR SELECCIONADO

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

PARA BORRAR LOS VALORES DE OPCIÓN

$('#employee_id').html('');
Shanka SMS
fuente
1
fefe solicita volver a configurar el texto del marcador de posición. Entonces, solo la primera parte de esta respuesta es válida.
nterms
2
Sí, por eso destaco el título de las respuestas.
Shanka SMS
2
La primera respuesta ya no se aplica desde> 4.0. ¡Pero la segunda opción me salvó! Esta es la solución cuando realmente desea borrar el select2. Simplemente configurando .val ('') para seleccionar 2, no es suficiente. También necesita borrar el html. ¡¡¡Muchas gracias!!!
wazza
8

Sé que esta es una pregunta antigua, pero funciona para la versión 4.0 de select2

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

o

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

si tiene eventos de cambio vinculados a él

Sean
fuente
Excelente solucion. Tuve que agregar la función .last () para apuntar al cuadro select2 recién agregado. $('#select2-element').last().val('').trigger('change.select2');
InsParbo
8

Use lo siguiente para configurar select2

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

Y para borrar la entrada seleccionada mediante programación

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

Esta es la forma correcta:

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

Estoy usando la última versión de Select2.

TreeZ
fuente
6

En primer lugar, debe definir select2 de esta manera:

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

Para restablecer select2, simplemente puede usar el siguiente bloque de código:

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

Puede borrar la selección por

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

Pero no volverá a su marcador de posición.

Entonces es una solución a medias

Rodrigo Butta
fuente
5

Probé las soluciones anteriores pero no funcionó para mí.

Este es un tipo de pirateo, donde no tienes que activar el cambio.

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

o

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

Para los usuarios que cargan datos remotos, esto restablecerá el select2 al marcador de posición sin activar ajax. Funciona con v4.0.3:

$("#lstProducts").val("").trigger("change.select2");
Chad Kuehn
fuente
Funcionó para mí, pero mi disparador fue solo 'cambio'
Gregory R. Sudderth
Esta fue la única solución que funcionó para mí para restablecer un Select2 de otro Select2 utilizando datos de Ajax.
IlludiumPu36
5

Entonces, para restablecer el formulario, algunos de ustedes tendrán un botón de reinicio. Agregue el siguiente código dentro de la etiqueta del script

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

O simplemente para vaciar el campo de selección sin mantener un marcador de posición:

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

Para el titular del lugar

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

Para restablecer un seleccione 2

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

Espero que esto ayude

Rinto George
fuente
2

Siguiendo la forma recomendada de hacerlo. Encontrado en la documentación https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (esto parece ser un problema bastante común):

Cuando esto sucede, generalmente significa que no tiene un espacio <option></option>en blanco como la primera opción en su <select>.

como en:

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

También estaba teniendo este problema y se debe a val(null).trigger("change");un No select2/compat/inputDataerror antes de que el marcador de posición se restablezca. Lo resolví detectando el error y configurando el marcador de posición directamente (junto con un ancho). Nota: Si tiene más de uno, deberá atrapar cada uno.

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

Estoy ejecutando Select2 4.0.3

Aba
fuente
Parece que tienes un oyente vinculado al changeevento. Intente disparar change.select2: eso no disparará oyentes vinculados (consulte github.com/select2/select2/issues/3620 ).
Paul
2

a partir de v.4.0.x ...

para borrar los valores, pero también restaurar el uso del marcador de posición ...

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

si está vacío, seleccionará el primer elemento de opción en su lugar, que puede no ser lo que desea

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

francamente ... Select2 es un dolor en el trasero, me sorprende que no haya sido reemplazado.

mangonights
fuente
1

He probado las soluciones anteriores pero ninguna funcionó con la versión 4x.

Lo que quiero lograr es: borrar todas las opciones pero no tocar el marcador de posición. Este código me funciona.

selector.find('option:not(:first)').remove().trigger('change');
R. Canser Yanbakan
fuente
Si utiliza selector.find ('opción: no (: primero)'). Html (''); deberia de funcionar.
wazza
1

Usando select2 versión 3.2 esto funcionó para mí:

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

No necesité implementar initSelection

temblar
fuente
1
Esta fue, con mucho, la forma más sencilla de hacerlo. Los otros métodos no me funcionaron.
chevybow
1

Después de probar las primeras 10 soluciones aquí y fallar, encontré que esta solución funcionaba (vea el comentario "nilov comentó el 7 de abril • editado" en la 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);

Luego se realiza el cambio:

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

(El autor mostró originalmente var $select = $(this[1]);, a lo que corrigió un comentarista var $select = $(this[0]);, que muestro arriba).

guero64
fuente
1

Use este código en su archivo js

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

Antes de borrar el valor con esta $("#customers_select").select2("val", ""); opción Intente establecer el foco en cualquier otro control al hacer clic en restablecer.

Esto mostrará el marcador de posición nuevamente.

usuario2243380
fuente
0

La interfaz DOM, ya realiza un seguimiento del estado inicial ...

Hacer lo siguiente es suficiente:

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

Bueno, cuando lo hice

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

Comencé a tener algún tipo de retraso después de unos tres o cuatro desencadenantes. Supongo que hay una pérdida de memoria. No está dentro de mi código porque si elimino esta línea, mi aplicación está libre de retrasos.

Como tengo las opciones de AllowClear establecidas en true, elegí

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

Esto puede ser seguido por un $ ('myselectdropdown'). Select2 ('close'); desencadenador de eventos en el elemento dom select2 en caso de que desee cerrar el menú desplegable de sugerencias abiertas.

Akhilesh Balachandder
fuente
0

Una forma [muy] hacky de hacerlo (lo vi funcionar para la versión 4.0.3):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • allowClear debe establecerse en verdadero
  • debe existir una opción vacía en el elemento seleccionado
Ellery Newcomer
fuente
0

Mi solución es:

$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
fuente
0
$('myselectdropdown').select2('val', '0')

donde 0 es tu primer valor del menú desplegable

Momaad Jamshed Alam
fuente