Pobieranie identyfikatorów i nazw użytkowników za pośrednictwem AJAX i używanie Select2 do ich wyszukiwania, ale moi użytkownicy poprosili o możliwość wyboru z menu rozwijanego przy użyciu klawisza Tab, traktując to jak naciśnięcie Enter. Oto moja deklaracja select2:Select2 4.0.0 AJAX - Wybierz wyróżnioną opcję za pomocą Tab
$("#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” wydaje się być skupiony elementem ilekroć widoczne, a element podświetlony rozwijanej dostaje klasę «select2-results__option - podkreślił.»
Próbowałem już kilku rozwiązań, ale nic nie zadziałało, szczególnie dlatego, że ten element pojawia się i znika w dowolnym momencie, gdy otwiera się rozwijane menu. Niestety, straciłem kod z moich prób, ale polegał głównie na wykonaniu preventDefault, kiedy Tab został trafiony na aktywnym wejściu, a następnie wywołaniu zdarzenia kliknięcia na podświetlonym elemencie lub wywołaniu klawisza Enter na wejściu.
Próbowałem także dostosować opcję selectOnClose, ale generalnie wydawało mi się to błędne i spowodowało nieskończoną pętlę, gdy miałem ją uruchomioną normalnie, znacznie mniej próbując ją przesłonić w oparciu o naciśnięty klawisz.
[Edycja]
Wybrane rozwiązanie działa, ale nie stanowią dla templateResult określonej zamiast wykazujące „() nieokreślone”. Tak więc, zmodyfikowałem go, aby dodać wyróżnioną odpowiedź jako wybraną opcję dla overlying Select, a następnie wywołaj zdarzenie change bezpośrednio w tym Select.
... (tak samo jak początkowej 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();
}
}
});
czy już to wymyśliłeś? W tych samych problemach. – grant
Nie ma kości, już wyczerpałem większość moich możliwości rozwiązywania problemów, zanim opublikowałem tutaj. Jeśli wiesz cokolwiek innego, powinienem oznaczyć to tagiem, aby pomóc ludziom znaleźć odpowiedź, daj mi znać, a ja to zmienię w poście. – MikeOShay
Doceniam to - spędziłem trochę czasu waląc w to również bez powodzenia. Dam ci znać, jeśli coś wymyślę :) – grant