Допустим, мой виджет autocomplete имеет 2 возможных варианта: "JavaScript" и "jQuery". Если я нажму "j" на входе, оба результата появятся. Теперь допустим, что я набираю «q», а затем сразу нажимаю «Tab». Есть только один возможный результат для «jq», и это «jQuery», но виджет в любом случае выбирает «JavaScript», потому что запрос ajax еще не вернулся, а «JavaScript» был тем, что все еще было выделено, когда я нажимал Tab.
Есть ли способ "исправить" это? то есть, я думаю, что должно произойти, я набираю «jq», нажимаю «tab», он оставляет «jq» на входе до тех пор, пока запрос не завершится, а затем, когда это произойдет, выбирает первый вариант.
Все еще не удается заставить это работать. Я пытался записать, когда он искал, и запретил выбор, как Andrew , но 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-вызов, чтобы получить единственное значение «наилучшего соответствия» на основе того, что находится на входе, а затем установить его. Не нужно снова открывать окно поиска.