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

162

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

$("#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;
   }
});
Теги:
jquery-select2

31 ответ

194
Лучший ответ

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

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

В reset select2

$("#customers_select").select2("val", "");
  • 6
    Я пробовал это с <select multip>, но я получаю ошибку: Опция 'initSelection' не разрешена для Select2 при присоединении к элементу <select>.
  • 13
    Это не работает для меня. Заполнитель все еще не появляется.
Показать ещё 9 комментариев
101

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

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

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

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

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

$('#your_select_input').val([]);
  • 117
    Это обновляет значение, но для его корректного отображения вам нужно вызвать событие изменения. $('#your_select_input').val('').trigger('change')
  • 2
    Это не работает для меня. Заполнитель все еще не появляется.
Показать ещё 10 комментариев
79

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

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

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

или

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

К reset:

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

или

$("#customers_select").empty().trigger('change')
  • 2
    Я обнаружил, что если вы не определили местозаполнитель, allowClear не работает
  • 0
    Ни $('#your_select_input').val('').trigger('change') ни $('#your_select_input').val(''); не работает в Firefox
Показать ещё 4 комментария
30

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

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

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

Ссылка

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

  • 2
    Я также использую v4.0.3 и $('select2element').val("").trigger("change") тоже работает нормально.
  • 1
    Это наиболее правильный способ согласно документам select2.
14

Используйте это:

$('.select').val([]).trigger('change');
  • 0
    Для меня работал с $ ('. Select2'). Val ([]). Trigger ('change');
  • 0
    это тоже работает с select2 (версия 4.0.3)
14

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

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

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

8

ИЗМЕНИТЬ ВЫБРАННОЕ ЗНАЧЕНИЕ

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

ДЛЯ ОЧИСТКИ ВАРИАНТОВ ВАРИАНТОВ

$('#employee_id').html('');
  • 0
    fefe просит переустановить текст заполнителя. Так что только первая часть этого ответа верна.
  • 2
    Да, именно поэтому я выделяю название ответов.
Показать ещё 1 комментарий
7

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

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

или

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

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

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

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

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

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

$("#id > option").removeAttr("selected");
$("#id").trigger("change");
4

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

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

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

4

Вы можете очистить выбор te

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

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

Итак, его полурешение

3

Используйте следующую команду, чтобы настроить 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");
3

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

$("#lstProducts").val("").trigger("change.select2");
  • 0
    Работал на меня, но мой триггер был просто «изменить»
2

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

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

  • 0
    Похоже, у вас есть слушатель, связанный с событием change . Попробуйте запустить change.select2 - это не вызовет связанных слушателей (см. Github.com/select2/select2/issues/3620 ).
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>
1

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

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

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

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

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

1

по состоянию на v.4.0.x...

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

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

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

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

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

1

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

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

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

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

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

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

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

или

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

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

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

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

$('#your_select_input').val('').trigger('change')

0

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

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

0

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

$('#id').val('1');
$('#id').trigger('change');
0
$('myselectdropdown').select2('val', '0')

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

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

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

0

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

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

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

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

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

Так как у меня есть опции allowClear для true, я пошел с

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

За этим может следовать $('myselectdropdown'). select2 ('close'); event trigger на элементе select2 dom в случае, если вы хотите закрыть раскрытое предложение.

0

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

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

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

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

Это снова отобразит заполнитель.

-1

Для reset значений и заполнителя я просто повторно инициализирую элемент select2:

$( "#select2element" ).select2({
    placeholder: '---placeholder---',
    allowClear: true,
    minimumResultsForSearch: 5,
    width:'100%'
});
  • 1
    Восстановление дома для очистки раковины на самом деле не является решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню