Я извлекаю идентификаторы и имена пользователей через AJAX и использую Select2 для поиска по ним, но мои пользователи запросили возможность выбора из раскрывающегося списка ввода, нажав Tab, что фактически обработало это как нажатие Enter. Вот мое объявление select2:
$("#user-select").select2({
ajax: {
url: "/api/User",
method: "get",
data: function (params) {
return {
search: params.term
};
},
beforeSend: function () {
$(".loading-results").text("Loading...");
},
processResults: function (data) {
return {
results: data
};
},
cache: true
},
allowClear: true,
placeholder: "Enter a User ID or Name",
templateResult: function (data) {
return "(" + data.id + ") " + data.name;
},
templateSelection: function (data) {
return "(" + data.id + ") " + data.name;
}
«.select2-search__field», кажется, является сфокусированным элементом всякий раз, когда выпадающее меню видно, а выделенный элемент получает класс «select2-results__option--highlighted».
Я пробовал несколько решений, но, похоже, ничего не сработало, особенно потому, что этот элемент появляется и исчезает каждый раз, когда открывается раскрывающийся список. К сожалению, я потерял код из-за своих попыток, но они в основном состояли из выполнения preventDefault при нажатии Tab на сфокусированном вводе, а затем запуска события щелчка на выделенном элементе или срабатывания клавиши ввода на вводе.
Я также пытался настроить параметр selectOnClose, но в целом он кажется ошибочным и вызывает бесконечный цикл, когда он работает нормально, а тем более пытается переопределить его в зависимости от того, какая клавиша нажата.
[Изменить]
Выбранное решение работает, но не учитывает указанный templateResult, вместо этого отображается "() undefined". Итак, я настроил его, чтобы добавить выделенный ответ в качестве выбранного варианта для вышележащего выбора, а затем вызвать событие изменения прямо на этом выборе.
... (то же, что и первоначальный select2)
}).on('select2:close', function (evt) {
var context = $(evt.target);
$(document).on('keydown.select2', function (e) {
if (e.which === 9) { // tab
var highlighted = context.data('select2').$dropdown.find('.select2-results__option--highlighted');
if (highlighted) {
var data = highlighted.data('data');
var id = data.id;
var display = data.name;
$("#user-select").html("<option value='" + id + "' selected='selected'>" + display + "</option>");
$("#user-select").change();
}
else {
context.val("").change();
}
}
});