Сбросьте значение select2 и покажите заполнитель

212

Как установить заполнитель при сбросе значения с помощью select2. В моем примере Если щелкнуть поля местоположения или оценки, и у моего select2 есть значение, значение select2 должно сброситься и отобразить заполнитель по умолчанию. Этот скрипт сбрасывает значение, но не показывает заполнитель

$("#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;
   }
});
Феф
источник

Ответы:

238

Вы должны определить select2 как

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

Сбросить select2

$("#customers_select").select2("val", "");
Абдельмалек
источник
7
Я пробовал это с <select multip>, но я получаю ошибку: Опция 'initSelection' не разрешена для Select2 при присоединении к элементу <select>.
Сорин Постельнику
15
Это не работает для меня. Заполнитель все еще не обнаруживается.
BCR
5
См. Ответ @Lego Stormtroopr ниже, который отражает новый метод в соответствии с API Select2. Вышеуказанный метод устарел.
Дэвид
14
Начиная с версии 4.0.3, это больше не .select2("val", "")работает.
adamj
31
$("#customers_select").val('').trigger('change') ;Я использовал это, и это сработало.
Акшай Кулкарни,
125

Select2 изменил свой API:

Select2: select2("val")метод устарел и будет удален в более поздних версиях Select2. Вместо этого используйте $ element.val ().

Лучший способ сделать это сейчас:

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

Изменить: декабрь 2016 года Комментарии предполагают, что ниже это обновленный способ сделать это:

$('#your_select_input').val([]);
Хакан Фистик
источник
136
Это обновляет значение, но для его корректного отображения вам нужно вызвать событие изменения. $('#your_select_input').val('').trigger('change')
Saneem
5
Это не работает для меня. Заполнитель все еще не обнаруживается.
BCR
3
Это работает для меня с changeдобавлением триггера, но также запускает используемую нами библиотеку проверки - сейчас мне придется использовать устаревшую версию.
Дэйв Ньютон,
6
Это не работает правильно, используя select2 4.0.2. Это сбросит выбор и восстановит заполнитель, но когда я выбираю новое значение (после сброса), я также вижу выбранный параметр «пустая строка» (т. Е. Поле с только «х» в нем).
kounoupis
1
$ ('# your_select_input'). val (''). trigger ('change') работает только при наличии заполнителя. иначе опция пустой строки будет отображаться как выбранная опция.
amol
118

Принятый ответ не работает в моем случае. Я пытаюсь это, и это работает:

Определите select2:

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

или

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

Для сброса:

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

или

$("#customers_select").empty().trigger('change')
NorthCat
источник
2
Я обнаружил, что если вы не определили местозаполнитель, allowClear не работает
Дэн Таппин
Ни то, $('#your_select_input').val('').trigger('change')ни другое$('#your_select_input').val(''); не работает в Firefox
Алекс Арт.
1
это работает для меня, он удаляет все данные из select2 я использую v4.0.3
ClearBoth
8
$ ("# customer_select"). empty (). trigger ('change') работает для меня. :)
Мунна Хан
1
'$ ("# customer_select"). empty (). trigger (' change ')' работает для меня, спасибо!
Тахирхан
52

Единственное, что может работать для меня:

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

Я использую версию 4.0.3

Ссылка

Согласно документации Select2

M.Tae
источник
2
Я также использую v4.0.3 и $('select2element').val("").trigger("change")работает нормально тоже.
Roubi
Обратите внимание, что у вас также должен быть пустой <option> внутри вашего <select>. Если вы используете ajax с select2, это поможет - $ ('# selectFieldId'). Prepend ('<option selected = "selected"> </ option>')
musicjerm
20

С Select2 версии 4.0.9 это работает для меня:

$( "#myselect2" ).val('').trigger('change');
IlludiumPu36
источник
1
Это сделало мой список select2 пустым. Работал на меня. Спасибо.
Disha
18

Select2 использует определенный класс CSS, поэтому его можно легко сбросить:

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

И у вас есть преимущество, если у вас есть несколько Select2 в одной форме, все они будут сброшены с помощью этой единственной команды.

Марсио Маццукато
источник
15

Использовать это :

$('.select').val([]).trigger('change');
Сачин Генд
источник
Для меня работал с $ ('. Select2'). Val ([]). Trigger ('change');
Марсело Агимовель
11

УДАЛИТЬ ВЫБРАННОЕ ЗНАЧЕНИЕ

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

ОЧИСТИТЬ ВАРИАНТЫ ОПЦИИ

$('#employee_id').html('');
Шанка СМС
источник
1
fefe просит переустановить текст заполнителя. Так что только первая часть этого ответа верна.
nterms
2
Да, именно поэтому я выделяю название ответов.
Shanka SMS
2
Первый ответ действительно больше не применяется с> 4.0. Но второй вариант спас меня! Это решение, когда вы хотите действительно очистить select2. Просто установить .val ('') для выбора 2 недостаточно. Вам также необходимо очистить HTML. Большое спасибо!!!
ваза
9

Я знаю, что это старый вопрос, но это работает для версии 4.0 select2

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

или

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

если у вас есть изменения событий, связанных с ним

Шон
источник
Отличное решение. Мне пришлось добавить функцию .last (), чтобы нацелиться на недавно добавленное поле select2. $('#select2-element').last().val('').trigger('change.select2');
InsParbo
8

Используйте следующие для настройки select2

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

И очистить выбор ввода программно

    $("#selectelementid").val("").trigger("change");
    $("#selectelementid").trigger("change");
Забит Рафик
источник
8

Это правильный путь:

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

Я использую последнюю версию Select2.

TreeZ
источник
6

Во-первых, вы должны определить select2 следующим образом:

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

Для сброса select2 просто используйте следующий блок кода:

$("#id > option").removeAttr("selected");
$("#id").trigger("change");
Махмут Айдын
источник
6

Вы можете отменить выбор

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

Но это не вернет вас к вашему заполнителю.

Так что это половина решения

Родриго Бутта
источник
5

Я попробовал вышеуказанные решения, но это не сработало для меня.

Это своего рода хак, когда вам не нужно вызывать изменения.

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

или

$("select").each(function () { //added a each loop here
        $(this).select2('destroy').val("").select2();
});
tech_boy
источник
5

Для пользователей, загружающих удаленные данные, это приведет к сбросу select2 в заполнитель без запуска ajax. Работает с v4.0.3:

$("#lstProducts").val("").trigger("change.select2");
Чад Куен
источник
Сработал для меня, но мой триггер был просто «изменить»
Грегори Р. Sudderth
Это было единственное решение, которое помогло мне сбросить Select2 с другого Select2, используя данные Ajax.
IlludiumPu36
5

Таким образом, для сброса формы у некоторых из вас будет кнопка сброса. Добавьте следующий код внутри тега script

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

Или просто очистить поле выбора без сохранения заполнителя:

$('.your_btn_class').click(function(){
    $('#select_field_id').val([]);
 });
Алиша Ламичхане
источник
3

Для местодержателя

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

Для сброса выбора 2

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

Надеюсь это поможет

Ринто Джордж
источник
2

Следуя рекомендованному способу сделать это. Найдено в документации https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (это, кажется, довольно распространенная проблема):

Когда это происходит, это обычно означает, что у вас нет пробела <option></option>в качестве первого варианта в вашем <select>.

как в:

<select>
   <option></option>
   <option value="foo">your option 1</option>
   <option value="bar">your option 2</option>
   <option value="etc">...</option>
</select>
fmsf
источник
2

У меня также была эта проблема, и она связана с val(null).trigger("change");выдачей No select2/compat/inputDataошибки до сброса заполнителя. Я решил это, поймав ошибку и установив заполнитель напрямую (вместе с шириной). Примечание: если у вас их больше одного, вам нужно поймать каждого из них.

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

Я использую Select2 4.0.3

аба
источник
Похоже, у вас есть слушатель, связанный с changeсобытием. Попробуйте запустить change.select2- это не вызовет связанных слушателей (см. Github.com/select2/select2/issues/3620 ).
Paul
2

с v.4.0.x ...

очистить значения, а также восстановить использование заполнителя ...

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

если он пуст, он выберет первый элемент опции, который может быть не тем, что вы хотите

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

честно говоря ... Select2 такая боль в заднице, меня поражает, что он не был заменен.

mangonights
источник
1

Я пробовал выше решения, но ни один не работал с версией 4x.

Чего я хочу добиться: очистить все варианты, но не трогать заполнитель. Этот код работает для меня.

selector.find('option:not(:first)').remove().trigger('change');
Р. Кансер Янбакан
источник
Если вы используете selector.find ('option: not (: first)'). Html (''); он должен работать.
ваза
1

Используя select2 версии 3.2 это сработало для меня:

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

Не нужно было реализовывать initSelection

Шак
источник
1
На мой взгляд, это был самый простой способ сделать это. Другие методы не работают для меня.
Chevybow
1

Попробовав первые 10 решений и потерпев неудачу, я обнаружил, что это решение работает (см. Комментарий nilov от 7 апреля • отредактированный »внизу страницы):

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

Затем вносятся изменения:

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

(Первоначально автор показал var $select = $(this[1]);, что исправил комментатор var $select = $(this[0]);, который я показываю выше.)

guero64
источник
1

Используйте этот код в свой файл JS

$('#id').val('1');
$('#id').trigger('change');
Nhoufy
источник
0

Прежде чем очистить значение с помощью этого, $("#customers_select").select2("val", ""); попробуйте установить фокус на любой другой элемент управления при нажатии кнопки сброса.

Это покажет заполнитель снова.

user2243380
источник
0

Интерфейс DOM уже отслеживает начальное состояние ...

Так что достаточно сделать следующее:

$("#reset").on("click", function () {
    $('#my_select option').prop('selected', function() {
        return this.defaultSelected;
    });
});
Эндрю Нартей
источник
0

Ну, когда бы я ни делал

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

Я начал испытывать некоторое отставание после трех-четырех срабатываний. Я полагаю, что есть утечка памяти. Это не в моем коде, потому что, если я удаляю эту строку, мое приложение будет без задержек.

Поскольку для параметров allowClear установлено значение true, я

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

Это может сопровождаться $ ('myselectdropdown'). Select2 ('close'); запуск события на элементе select2 dom, если вы хотите закрыть раскрывающийся список открытых предложений.

Ахилеш Балаханддер
источник
0

Один [очень] хакерский способ сделать это (я видел, как это работает для версии 4.0.3):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • allowClear должен быть установлен в true
  • в элементе выбора должна существовать пустая опция
Ellery Новичок
источник
0

Мое решение:

$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');
    });
Даниэль Ортегон
источник
0
$('myselectdropdown').select2('val', '0')

где 0 - ваше первое значение раскрывающегося списка

Момаад Джамшед Алам
источник