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

Как установить заполнитель при сбросе значения с помощью 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;
   }
});

person fefe    schedule 30.07.2013    source источник


Ответы (39)


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

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

Чтобы сбросить select2

$("#customers_select").select2("val", "");
person AbdelMalek    schedule 22.10.2013
comment
Я пробовал это с ‹select multiple›, но получаю сообщение об ошибке: опция initSelection не разрешена для Select2 при присоединении к элементу ‹select›. - person Sorin Postelnicu; 12.12.2014
comment
У меня это не работает. Заполнитель по-прежнему не отображается. - person bcr; 04.05.2015
comment
$ (# customers_select) .select2 (val,); работает у меня: D - person Spl2nky; 30.07.2015
comment
См. Ответ @Lego Stormtroopr ниже, который отражает новый метод в соответствии с API Select2. Вышеуказанный метод устарел. - person David; 04.03.2016
comment
Начиная с версии 4.0.3, похоже, что .select2("val", "") больше не работает. - person adamj; 06.08.2016
comment
$ (# selectId) .empty (). select2 (); - person Danilo Pádua; 19.09.2016
comment
@Danilo очищает все значения из раскрывающегося списка, если вы пытаетесь найти / выбрать другое значение, - person Muhammad Omer Aslam; 27.05.2017
comment
$ (# customers_select) .select2 ({данные:, заполнитель: выберите клиента}); - person Fai Zal Dong; 04.07.2017
comment
$ (# customers_select) .select2 (данные, ноль); - person Adrian P.; 12.12.2017
comment
$("#customers_select").val('').trigger('change') ; Я использовал это, и это сработало. - person Akshay Kulkarni; 23.02.2018
comment
$ (# selectId) .empty (). select2 () также работает для меня, но я все еще не могу сбросить текст заполнителя - person SolaceBeforeDawn; 20.07.2018
comment
@adamj, как я могу это сделать, не вызывая его. - person Varun Chawla; 20.08.2019

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

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

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

or

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

Для сброса:

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

or

$("#customers_select").empty().trigger('change')
person NorthCat    schedule 03.03.2016
comment
Я обнаружил, что если у вас не определен заполнитель, allowClear не работает - person Dan Tappin; 26.07.2016
comment
Ни $('#your_select_input').val('').trigger('change'), ни $('#your_select_input').val(''); не работают в Firefox - person Alex Art.; 11.10.2016
comment
это работает для меня, он удаляет все данные из select2, который я использую v4.0.3 - person ClearBoth; 26.01.2017
comment
$ (# customers_select) .empty (). trigger ('change') работает для меня. :) - person Munna Khan; 07.03.2017
comment
@NorthCat Спасибо. Я явно добавлял значения в свой select2, поэтому .val ('') не работал. Затем я увидел в вашем ответе пустое слово и понял, что мне нужно использовать пустой, и это сработало. Спасибо еще раз. - person Vibhav Chaddha; 06.10.2017
comment
По какой-то причине. . . работал только пустой (). trigger ('change'). . . - person Andrew; 25.05.2018
comment
'$ (# customers_select) .empty (). trigger (' change ')' сработал для меня, спасибо! - person Tahirhan; 12.12.2019
comment
этот работает очень хорошо $("#customers_select").empty().trigger('change') - person sta; 30.05.2020
comment
$("#customers_select").val('').trigger('change') работал у меня. :) Спасибо! - person Sushant Pimple; 14.06.2020

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

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

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

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

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

$('#your_select_input').val([]);
person Community    schedule 02.02.2015
comment
Это обновляет значение, но для того, чтобы оно отображалось правильно, вам нужно будет инициировать событие изменения. $('#your_select_input').val('').trigger('change') - person Saneem; 24.03.2015
comment
У меня это не работает. Заполнитель по-прежнему не отображается. - person bcr; 04.05.2015
comment
У меня это работает с добавлением триггера change, но также запускает используемую нами библиотеку проверки - пока мне придется использовать устаревшую версию. - person Dave Newton; 03.06.2015
comment
Это не работает правильно при использовании select2 4.0.2. Он сбросит выделение и восстановит заполнитель, но когда я выберу новое значение (после сброса), я также вижу выбранную опцию пустой строки (т. Е. Поле с только x). - person kounoupis; 04.03.2016
comment
@kounoupis, у меня такая же проблема. ты нашел исправление для этого? - person amol; 13.06.2016
comment
$ ('# your_select_input'). val (''). trigger ('change') работает, только если указан заполнитель. иначе опция пустой строки будет отображаться как выбранная опция. - person amol; 14.06.2016
comment
Ни $('#your_select_input').val('').trigger('change'), ни $('#your_select_input').val(''); не работают в Firefox - person Alex Art.; 11.10.2016
comment
Разве это не должно быть val([])? - person TrueWill; 19.12.2016
comment
@TrueWill может быть - у меня не было возможности проверить это. Если val([]) работает, не стесняйтесь обновлять ответ. - person ; 20.12.2016
comment
$ (). Val ([]) работал у меня, когда ничто другое не помогало. Кажется, это текущий ответ. - person jessier3; 27.12.2016
comment
Правильный способ (см. Код кнопки очистки: select2.github.io/examples.html# программно) заключается в том, чтобы установить значение null и инициировать событие изменения: $('#your_select_input').val(null).trigger('change'); Если вы не хотите, чтобы связанные change слушатели запускались (т.е. незаметно изменяли значение), то вместо этого запускайте change.select2 (github.com/select2/select2/issues/3620) - person Paul; 23.03.2017
comment
как сказал @amol, нам нужно инициировать изменение, если нет, выбранные параметры очищаются, но они выбраны на входе выбора. - person wangsir; 25.11.2019
comment
$('#your_select_input').val([]).trigger('change'); сделал работу за меня - person Modo; 07.12.2020

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

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

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

Ссылка

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

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

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

$( "#myselect2" ).val('').trigger('change');
person IlludiumPu36    schedule 27.08.2019
comment
Это сделало мой выпадающий список select2 пустым. Работал у меня. Спасибо. - person disha; 03.04.2020

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

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

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

person Marcio Mazzucato    schedule 01.11.2014

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

$('.select').val([]).trigger('change');
person Sachin Gend    schedule 29.09.2017
comment
У меня работал с $ ('. Select2'). Val ([]). Trigger ('change'); - person Marcelo Agimóvel; 10.01.2018

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

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

ЧТОБЫ ОЧИСТИТЬ ОПЦИОНАЛЬНЫЕ ЗНАЧЕНИЯ

$('#employee_id').html('');
person Shanka SMS    schedule 23.07.2015
comment
fefe просит переустановить текст заполнителя. Итак, действительна только первая часть этого ответа. - person nterms; 06.08.2015
comment
Да, поэтому я выделяю заголовок ответов. - person Shanka SMS; 14.10.2015
comment
Первый ответ: действительно, он больше не применяется в ›4.0. Но меня спас второй вариант! Это решение, когда вы действительно хотите очистить select2. Просто установите .val ('') для выбора 2, этого недостаточно. Вам также необходимо очистить файл html. Большое спасибо!!! - person wazza; 15.06.2017
comment
в любом случае спасибо @ShankaSMS Я искал решение для сброса и повторной привязки данных к select2 - person Aung Aung; 06.12.2020

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

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

or

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

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

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

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

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

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

person TreeZ    schedule 28.03.2018

Используйте следующее для настройки 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");
person Zabith Rafeek    schedule 02.08.2017

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

Это своего рода взлом, при котором не нужно инициировать изменение.

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

or

$("select").each(function () { //added a each loop here
        $(this).select2('destroy').val("").select2();
});
person tech_boy    schedule 12.04.2017
comment
В своей реализации я изменил что-то вроде: $ (# select) .on ('change', function () {$ (this) .val (). Select2 ();}); - person Carlos Espinoza; 15.04.2021

Сначала вы должны определить select2 следующим образом:

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

Чтобы сбросить select2, просто вы можете использовать следующий блок кода:

$("#id > option").removeAttr("selected");
$("#id").trigger("change");
person Mahmut Aydın    schedule 23.07.2017

Вы можете очистить выделение с помощью

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

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

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

person Rodrigo Butta    schedule 26.01.2017

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

$("#lstProducts").val("").trigger("change.select2");
person Chad Kuehn    schedule 31.07.2017
comment
Сработало для меня, но моим спусковым крючком было просто `` изменение '' - person Gregory R. Sudderth; 03.08.2017
comment
Это было единственное решение, которое помогло мне сбросить Select2 из другого Select2 с использованием данных Ajax. - person IlludiumPu36; 27.08.2019

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

$('.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([]);
 });
person Alisha Lamichhane    schedule 27.08.2019

Для заполнителя

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

Для сброса выберите 2

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

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

person Rinto George    schedule 09.05.2018

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

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

as in:

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

У меня также была эта проблема, и она связана с 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

person Aba    schedule 22.11.2016
comment
Похоже, у вас есть слушатель, привязанный к событию change. Попробуйте запустить change.select2 - это не вызовет связанных слушателей (см. github.com/select2/select2/issues / 3620). - person Paul; 23.03.2017

as of v.4.0.x...

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

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

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

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

откровенно говоря ... Select2 - это такая заноза в заднице, меня удивляет, что его не заменили.

person mangonights    schedule 04.07.2017

Попробовав первые 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]);, которое я показываю выше.)

person guero64    schedule 27.07.2017
comment
это единственное, что сработало для меня ... годы спустя - person PedroGabriel; 16.03.2021

С сайта select2,

$("#mySelect2ControlId").val(null).trigger("change");
person Programnik    schedule 13.05.2020

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

это удалит значения И, что наиболее важно для меня, также удалит пустую кнопку x

person Игорь Хлебников    schedule 25.05.2020

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

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

selector.find('option:not(:first)').remove().trigger('change');
person Canser Yanbakan    schedule 14.03.2017
comment
Если вы используете selector.find ('option: not (: first)'). Html (''); он должен работать. - person wazza; 15.06.2017

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

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

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

person shak    schedule 29.04.2017
comment
Для меня это был самый простой способ сделать это. Остальные методы у меня не работали. - person chevybow; 07.09.2018

$('myselectdropdown').select2('val', '0')

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

person Momaad Jamshed Alam    schedule 09.01.2018
comment
Большое спасибо, раньше ничего не работало. - person Emmanuel Chamilakis; 22.02.2021

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

$('#id').val('1');
$('#id').trigger('change');
person Nhoufy    schedule 10.09.2018

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

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

person user2243380    schedule 12.08.2015

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

Поэтому достаточно сделать следующее:

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

Хорошо, когда бы я ни делал

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

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

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

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

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

person Akhilesh Balachandder    schedule 29.08.2016

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

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

Чтобы сбросить значения и заполнитель, я просто повторно инициализирую элемент select2:

$( "#select2element" ).select2({
    placeholder: '---placeholder---',
    allowClear: true,
    minimumResultsForSearch: 5,
    width:'100%'
});
person Max    schedule 03.02.2017
comment
Перестроить дом, чтобы мыть раковину, на самом деле не решение. - person Felini; 27.02.2017
comment
Совершенно верно, @Felini, но когда элемент управления не обеспечивает чистый способ сбросить себя без вызова события изменения, вы, к сожалению, должны делать то, что должны, без взлома элемента управления. У меня есть слушатели проверки, работающие по событию изменения для элементов выбора. Запуск события изменения подтверждает и показывает сообщение об ошибке, которое не нужно видеть в форме сброса. - person WebTigers; 05.07.2021

Мое решение:

$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');
    });
person Daniel Ortegón    schedule 04.09.2017

Я не знаю, испытывал ли это кто-нибудь еще, но как только код попал в триггер («изменение»), мой javascript просто остановился, никогда не возвращался из триггера, а остальная часть функции никогда не выполнялась.

Я недостаточно знаком с триггером jquerys, чтобы сказать, что этого не ожидается. Я обошел это, заключив в setTimeout, некрасиво, но эффективно.

person rgvtim    schedule 08.10.2018

Если вы хотите очистить все входы select2, например, при закрытии модального окна, вы можете добавить класс «select2» и вернуть их все обратно в их заполнители, например.

$('#myModal').on('hidden.bs.modal', function (e) {
    $(this)
        .find(".select2").select2({placeholder: "Choose an option"})
        .val('').trigger('change.select2');
});

Такой подход одновременного сброса всех значений можно использовать и для форм. Версия, в которой это работает для меня, - 4.0.10.

person david    schedule 05.05.2020

Это решение работает для меня (Select2 4.0.13)

$('#select').on("select2:unselecting", function (e) {
   $(this).val('').trigger('change');
   e.preventDefault();
});
person Andrea Fini    schedule 17.08.2020

<label for="RECEIVED_BY" class="control-label"> Received into store By </label>
<label class="pull-right">
  <button
    type="button"
    title="Clear Received into store By"
    class="receive_clear clear-button"
    aria-label="Select2 options"
  >
    x
  </button></label
>
<select type="text" class="clear_receive_info_by">
  <option value="">--Select--</option>
  <option value="value1">value1</option>
  <option value="value2">value2</option>
  <option value="value3">value3</option>
</select>

jQuery:

var $clear_receive_info_by = $(".clear_receive_info_by").select2();
$(".receive_clear").on("click", function () {
    $clear_receive_info_by.val(null).trigger("change");
});
person Mohammad Ali Abdullah    schedule 09.12.2020

Я прочитал все ответы, и многие из них устарели.

Вот как в настоящее время вы можете очистить и установить значение заполнителя:

// Clear and put a blank select placeholder
$("#MySelect").prop('disabled', false).find("option:gt(0)").remove();
person Mauricio Solórzano    schedule 22.01.2021

Я делаю это для этого случая:

  $('#select').val('');
  $('.select2.select2-container').remove();
  $('.select2').select2();
  1. Я меняю значение выбора на пустое
  2. Убираю контейнер для select2
  3. Повторный вызов select2
person Scramble    schedule 16.01.2019