Как программно вводить поисковые запросы в Select2 v4?

Я создал веб-приложение, используя окно поиска Select2, которое подключается к нашему серверу через AJAX. Поле поиска передает запрос (например, «ЯБЛОКИ») серверной части, которая затем обновляет страницу. Как программно вводить поисковые запросы в поле поиска? Мне нужно передать «val», чтобы select2 вызывал бэкэнд через AJAX и обновлял страницу. Я уверен, что это очевидно, но я не смог найти это в документации.

Например, вместо того, чтобы заставлять пользователя вводить «ЯБЛОКИ» в поле поиска, я бы хотел, чтобы пользователь нажимал кнопку, и слово «ЯБЛОКИ» автоматически заполнялось в поле поиска, а затем обновлялось страница.

Спасибо!


После комментария Кевина я не нахожусь в этом состоянии, когда текст встроен в поле поиска, а селектор выбрал правильный элемент. Как мне отправить (или инициировать) этот запрос, я пробовал «клавишу», «нажать», «отправить», «щелкнуть» (что очищает поле) и т. д.

введите здесь описание изображения


person vgoklani    schedule 28.05.2015    source источник
comment
Между прочим, награда невозможна, потому что невозможно определить, когда запущенный запрос AJAX завершится, без подключения к глобальному обработчику AJAX.   -  person Kevin Brown    schedule 10.06.2015
comment
Просто чтобы подтвердить, нет никакого способа заставить переход по клику?   -  person vgoklani    schedule 10.06.2015
comment
В любом случае, я благодарен за всю вашу помощь, и награда за вас.   -  person vgoklani    schedule 10.06.2015
comment
Вы можете принудительно выбрать результат, имитируя событие mouseup (или просто вводя <option>, если у вас есть информация), но вы не можете предсказать (точно), когда будет отображаться список результатов. результат.   -  person Kevin Brown    schedule 10.06.2015


Ответы (7)


Раньше Select2 предоставлял вспомогательный метод select2('search', 'term'), который помогал бы в этом, но он не был перенесен в Select2 4.0.0.

Есть несколько способов, как это можно сделать, но в целом все они следуют одному и тому же шаблону шагов.

  1. Откройте раскрывающийся список Select2
  2. Введите искомый текст в поле поиска
  3. Инициировать события клавиатуры, необходимые для того, чтобы Select2 начал поиск (обычно input)

Итак, прямо сейчас в Select2 4.0.0 код для этого будет выглядеть так:

$('select').select2();

function select2_search ($el, term) {
  $el.select2('open');
  
  // Get the search box within the dropdown or the selection
  // Dropdown = single, Selection = multiple
  var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search;
  // This is undocumented and may change in the future
  
  $search.val(term);
  $search.trigger('keyup');
}

$('button').on('click', function () {
  var $select = $($(this).data('target'));
  select2_search($select, 'Arizona');
});
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>

<select style="width: 200px;" id="single">
  <option value="AL">Alabama</option>
  <option value="AK">Alaska</option>
  <option value="AZ">Arizona</option>
</select>

<button type="button" data-target="#single">Search for 'Arizona'</button>
<br /><br />

<select style="width: 200px;" id="multiple" multiple="multiple">
  <option value="AL">Alabama</option>
  <option value="AK">Alaska</option>
  <option value="AZ">Arizona</option>
</select>

<button type="button" data-target="#multiple">Search for 'Arizona'</button>

Хотя в этом примере не используется AJAX, он инициирует запрос AJAX, если для него настроен Select2.

person Kevin Brown    schedule 30.05.2015
comment
Спасибо за ответ, Кевин. К сожалению, я не вижу переменную $search после $e1.data('select2').dropdown. Я также делаю вызов AJAX, поэтому select2 не видит все идентификаторы до тех пор, пока не будет получен запрос AJAX. Я работаю над этим несколько дней, надеюсь, вы сможете прояснить ситуацию. Спасибо - person vgoklani; 03.06.2015
comment
Я должен добавить, что у меня есть два окна поиска, и только одно использует AJAX. Блок select2 без ajax легко обрабатывает инъекции через $selectionBox.val(23).change('trigger'). Я предполагаю, что версия AJAX не работает, поскольку у нее нет идентификаторов. когда я запускаю эту функцию $selectionBoxAJAX.val(47).change('trigger'), обновляется обновление (обновляется экран), но запрос пуст, и правильный текст не обновляется - person vgoklani; 03.06.2015
comment
@vgoklani Я думаю, проблема может заключаться в том, что вы используете множественный выбор, хотите просто подтвердить это (и я могу обновить этот ответ, чтобы также поддержать его). - person Kevin Brown; 03.06.2015
comment
Да, я использую множественный выбор - person vgoklani; 03.06.2015
comment
Я обновил свой ответ, чтобы он работал и для множественного выбора, и включил для них пример. - person Kevin Brown; 03.06.2015
comment
Спасибо, Кевин, почти готово! Текст теперь находится в поле выбора и выделен в раскрывающемся списке. Что является триггером для его отправки? - person vgoklani; 03.06.2015
comment
Я добавил изображение, чтобы показать вам, где именно я застрял. Еще раз спасибо за помощь! - person vgoklani; 03.06.2015
comment
Это не завершено, как вы потом имитируете ENTER, чтобы раскрывающийся список принимал введенную строку и закрывался? - person goyote; 06.05.2016
comment
Итак, триггер('keyup') ничего для меня не сделал, в итоге я использовал s2Obj.trigger('query', {term:term}); чтобы запустить поиск с нужным мне термином - person phazei; 18.06.2016
comment
в соответствии с комментарием / вопросом @goyote - как вы потом имитируете ENTER, чтобы раскрывающийся список принимал введенную строку и закрывался - где-то был дан ответ? - person user3057544; 23.11.2016
comment
Я могу имитировать ENTER с помощью $('.select2-results__option[aria-selected]') .trigger(mouseup); - person Santiago; 28.02.2017
comment
@Kevin Я не javascript SME, как работает конечный $search в $search = $el.data('select2').dropdown.$search? Как вы получаете доступ к $search до того, как он будет предоставлен? Я не слежу за этой частью. Можете ли вы отредактировать объяснение в своем ответе? Вы лично предпочитаете не связывать val() и trigger()? - person mickmackusa; 08.06.2021

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

поэтому на основе ответа Кевина Брауна:

$('select').select2();

function select2_search ($el, term) {
  $el.select2('open');

  // Get the search box within the dropdown or the selection
  // Dropdown = single, Selection = multiple
  var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search;
  // This is undocumented and may change in the future

  $search.val(term);
  $search.trigger('input');
}

$('button').on('click', function () {
  var $select = $($(this).data('target'));
  select2_search($select, 'Arizona');
});
person Marc A.    schedule 09.02.2017

Ответы на этой странице привели меня почти туда. И поскольку у других, похоже, такие же проблемы, я делюсь тем, как я их решил.

Некоторые из комментариев к ответу Кевина Брауна спрашивали, как имитировать ENTER после того, как текст был введен и выделен.

Мне удалось это сделать только с тайм-аутом:

setTimeout(function() { $('.select2-results__option').trigger("mouseup"); }, 500);

Итак, полное решение будет таким:

$('select').select2();

function select2_search ($el, term) {
  $el.select2('open');

  // Get the search box within the dropdown or the selection
  // Dropdown = single, Selection = multiple
  var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search;
  // This is undocumented and may change in the future

  $search.val(term);
  $search.trigger('input');
  setTimeout(function() { $('.select2-results__option').trigger("mouseup"); }, 500);

}

$('button').on('click', function () {
  var $select = $($(this).data('target'));
  select2_search($select, 'Arizona');
});
person sunomad    schedule 07.04.2018

Вы можете установить minimumInputLength на 0, затем в функции data вы можете проверить params.term length и, если это 0, установить значение фильтра на предопределенное значение поиска.

Это довольно глупо, но это работает ;)

person Edu    schedule 25.02.2016
comment
Это то, что я искал! Спасибо за предложение MinimumInputLength: 0. Моя задача состояла в том, чтобы предварительно заполнить select2 некоторыми исходными данными с помощью ajax-вызова. Поэтому все, что мне нужно сделать, это установить минимальный ввод равным 0 и отфильтровать запрос с пустым параметром GET q= на сервере и вернуть значения по умолчанию. Потрясающий! - person Johnner; 25.01.2017

В дополнение к этому ответу мы пытались программно добавить новый «тег» в select2, настроенный для тегирования. Вместо того, чтобы запускать событие keyup в поле поиска $, нам пришлось сделать следующее.

$search.val(tag);
$search.closest('.select2-search--inline')
    .trigger($.Event('input', { which: 13 }));
$search.closest('.select2-selection--multiple')
    .trigger($.Event('keydown', { which: 13 }));

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

person skila    schedule 24.07.2015
comment
Триггеры ключевых событий заблокированы браузером с 2019 г. по соображениям безопасности. - person Faizan Anwer Ali Rupani; 25.01.2019

Для тех, кто использует вызов Ajax для заполнения select2 и хочет найти и установить выбранное значение.

Есть и другой способ, но этот ответ отлично работает для меня с Select2 4.0.0

  • Для набора ударов я использовал функцию Делея

JS

$('.select2').select2();

    function select2_search_and_set(controlId, term) {
var control = $("#" + controlId);
var $search = control.data('select2').dropdown.$search || control.data('select2').selection.$search;

$search.val(term);
$search.trigger('keyup');

setTimeout(function () {
    $search.trigger($.Event('keydown', { which: 13 }));
}, 500);
}

   select2_search_and_set("target", 'term');

HTML

<select class="form-control select2" id="target" name="target"></select>
person Dalim Mohammad    schedule 20.04.2021

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

С помощью комбинаций формы ответа здесь мне удалось решить мою проблему.

Сделать это:

  1. Сначала мне нужно было установить для опции tags на select2 значение true

  2. Не нужно было открывать select2

  3. Мне нужно было изменить триггер с «keyup» на «input».

  4. Мне нужно было добавить следующую строку в конце, чтобы имитировать клавишу ввода $('.select2-results__option').trigger(mouseup);

     Here is the jsfiddle sample for you to try for yourself
    

    https://jsfiddle.net/jainpankaj/o8g37wfu/8/#&togetherjs=I0e96aNexC< /а>

person Pankaj Jain    schedule 07.07.2021