Допустим, мой виджет автозаполнения имеет 2 возможных варианта: "JavaScript" и "jQuery". Если я нажму, введите «j» во ввод, появятся оба результата. Теперь предположим, что я набираю «q», а затем сразу же нажимаю Tab. Есть только один возможный результат для «jq», и это «jQuery», но виджет все равно выбирает «JavaScript», потому что запрос ajax еще не вернулся, а «JavaScript» все еще был выделен, когда я нажимаю вкладку.
Есть ли способ "исправить" это? то есть, я думаю, что должно произойти, я набираю "jq", нажимаю вкладку, он оставляет "jq" на входе до тех пор, пока запрос не завершится, а затем, когда это произойдет, выберет первый вариант.
Все еще есть проблемы с тем, чтобы заставить это работать. Я пытался записывать, когда он искал, и запрещал выбор, например Эндрю делает, но loading
никогда не кажется правдой, поэтому я не могу его отменить... на самом деле, я думаю, это потому, что delay
не было выполнено а следующий поиск даже не начался... Мне нужно что-то привязать к событию нажатия клавиши.
Хорошо. Думаю, я почти понял:
$('#myselector').autocomplete({
source: function(request, response) {
var data = {};
$(this.element).data('keyHandled', true).data('lastTerm', request.term);
// *snip*
$.ajax({
url: '/ajax/major_city',
dataType: 'json',
data: data,
success: function(data, textStatus, $xhr) {
response(data);
},
error: function($xhr, textStatus) {
response([]);
},
});
},
select: function(event, ui) {
if(!$(this).data('keyHandled')) {
// TODO perform another search for just one value and set the input immediately
return false;
}
this.value = ui.item.value;
$(this).trigger('change');
return false;
},
minLength: 0,
autoFocus: true,
delay: 250
})
.keydown(function(event) {
if($(this).val() !== $(this).data('lastTerm')) {
$(this).data('keyHandled', false);
}
});
Кажется, что это правильно «отменяет» выбор, если пользователь вышел из ввода после ввода группы, но до того, как была достигнута задержка/начался следующий поиск. Теперь мы можем выполнить еще один вызов ajax, чтобы получить одно значение «наилучшего совпадения» на основе входных данных, а затем установить его. Нет необходимости снова открывать окно поиска.