Я использую поле автозаполнения пользовательского интерфейса JQuery, которое привязано к поиску ajax, который может быть довольно медленным в разы. Иногда пользователь будет отходить от поля ввода текста после того, как инициируется запрос ajax, но до возвращает вызов ajax. Когда это произойдет, всплывающее окно автозаполнения появляется, даже если текстовый ввод больше не имеет фокуса, и единственный способ отклонить всплывающее окно - это выбрать элемент (вместо того, чтобы переходить в другое поле).
Фактически этот jquery ui demo демонстрирует такое же поведение (например, введите "ariz" в текстовое поле, дождитесь "поиска" ', чтобы отобразиться, а затем выйдите из поля, прежде чем он вернет какие-либо результаты).
Одним из решений, которое работает (но похоже на хак), является проверка обратного вызова успеха ajax, чтобы увидеть, имеет ли текстовое поле все еще фокус, и если вы не вызываете response() с пустым списком, например:
$( "#city" ).autocomplete({
var elem = this.element;
source: function( request, response ) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
data: {name_startsWith: request.term},
success: function( data ) {
if(!$(elem).is(':focus') {
response({});
return;
}
response( $.map( data.geonames, function( item ) {
return {
label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
value: item.name
}
}));
}
});
}
});
Есть ли более изящное решение? В идеале я хотел бы отменить запрос ajax, как только пользователь уйдет от поля ввода текста.