Я использую виджет автозаполнения jquery ui с ajax и заметил следующую проблему.
Фон: для того, чтобы пользователь мог сосредоточиться на автозаполнении и получить параметры, не вводя ничего, я использую событие focus:
autoComp.focus(function() { $(this).autocomplete("search", "");}
Однако это приводит к следующему эффекту: когда пользователь щелкает, отправляется запрос ajax. В ожидании ответа пользователь затем щелкает в другом месте, и автозаполнение размывается. Но как только ответ возвращается, появляется меню опций, хотя автозаполнение не имеет фокуса. Чтобы его убрать, пользователь должен щелкнуть один раз внутри и снова за пределами автозаполнения, что немного раздражает.
есть идеи, как мне это предотвратить?
РЕДАКТИРОВАТЬ: я решил это очень уродливо путем создания другой медиаторной функции, которая знает идентификатор элемента, и эта функция вызывает функцию ajax с идентификатором, которая в случае успеха проверяет фокус элемента и возвращает ноль, если не сфокусировано. Это довольно уродливо, и я все еще ищу альтернативы.
РЕДАКТИРОВАТЬ # 2: Попытка сделать, как предложил Wlliam, все еще не работает .. XR не определен при размытии. Какая-то проблема с ключевым словом this
, может, оно имеет другое значение, если я напишу функцию getTags вне автозаполнения?
this.autocomplete = $('.tab#'+this.id+' #tags').autocomplete({
minLength: 0,
autoFocus: true,
source: getTags,
select: function(e, obj) {
tab_id = $(this).parents('.tab').attr('id');
tabs[tab_id].addTag(obj.item.label, obj.item.id, false);
$(this).blur(); // This is done so that the options menu won't pop up again.
return false; // This is done so that the value will not stay in the input box after selection.
},
open: function() {},
close: function() {}
});
$('.tab#'+this.id+' #tags').focus(function() {
$(this).autocomplete("search", "");
});
$('.tab#'+this.id+' #tags').blur(function() {
console.log('blurring');
var xhr = $(this).data('xhr'); // This comes out undefined... :(
if (xhr) {
xhr.abort();
};
$(this).removeClass('ui-autocomplete-loading');
});
и это функция getTags, скопированная в ключевое слово source:
function getTags(request, response)
{
console.log('Getting tags.');
$(this).data('xhr', $.ajax({
url: '/rpc',
dataType: 'json',
data: {
action: 'GetLabels',
arg0: JSON.stringify(request.term)
},
success: function(data) {
console.log('Tags arrived:');
tags = [];
for (i in data) {
a = {}
a.id = data[i]['key'];
a.label = data[i]['name'];
tags.push(a);
}
response(tags);
}
}));
console.log($(this).data('xhr'));
}