Я использую jQuery UI AutoComplete control (только что обновленный до jQuery UI 1.8.1). Всякий раз, когда пользователь покидает текстовое поле, я хочу установить содержимое текстового поля в известное значение и установить поле скрытого идентификатора для выбранного значения. Кроме того, я хочу, чтобы страница была отправлена обратно, когда содержимое текстового поля было изменено.jQuery AutoComplete выбрать стрельбу после смены?
В настоящее время я реализую это, когда событие выбора автозаполнения задает скрытый идентификатор, а затем событие изменения в текстовом поле, которое устанавливает значение текстового поля и, при необходимости, вызывает сообщение назад.
Если пользователь просто использует клавиатуру, это работает отлично. Вы можете ввести, используйте стрелки вверх и вниз, чтобы выбрать значение, а затем вкладку, чтобы выйти. Событие выбора срабатывает, идентификатор установлен, а затем происходит событие изменения, и страница возвращается.
Если пользователь начинает вводить текст, а затем использует мышь, чтобы выбрать из параметров автозаполнения, но событие изменения срабатывает (когда фокус переходит в меню автозаполнения?), А страница возвращается обратно до того, как событие выбора имеет возможность установить ID.
Есть ли способ, чтобы событие изменения не срабатывало до тех пор, пока не произойдет событие select, даже если используется мышь?
$(function() {
var txtAutoComp_cache = {};
var txtAutoComp_current = { label: $('#txtAutoComp').val(), id: $('#hiddenAutoComp_ID').val() };
$('#txtAutoComp').change(function() {
if (this.value == '') { txtAutoComp_current = null; }
if (txtAutoComp_current) {
this.value = txtAutoComp_current.label ? txtAutoComp_current.label : txtAutoComp_current;
$('#hiddenAutoComp_ID').val(txtAutoComp_current.id ? txtAutoComp_current.id : txtAutoComp_current);
} else {
this.value = '';
$('#hiddenAutoComp_ID').val('');
}
// Postback goes here
});
$('#txtAutoComp').autocomplete({
source: function(request, response) {
var jsonReq = '{ "prefixText": "' + request.term.replace('\\', '\\\\').replace('"', '\\"') + '", "count": 0 }';
if (txtAutoComp_cache.req == jsonReq && txtAutoComp_cache.content) {
response(txtAutoComp_cache.content);
return;
}
$.ajax({
url: 'ajaxLookup.asmx/CatLookup',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: jsonReq,
type: 'POST',
success: function(data) {
txtAutoComp_cache.req = jsonReq;
txtAutoComp_cache.content = data.d;
response(data.d);
if (data.d && data.d[0]) { txtAutoComp_current = data.d[0]; }
}
});
},
select: function(event, ui) {
if (ui.item) { txtAutoComp_current = ui.item; }
$('#hiddenAutoComp_ID').val(ui.item ? ui.item.id : '');
}
});
});
Значения текстового поля и скрытых идентификаторов сохраняются из предыдущих сообщений, поэтому я не вижу простого способа определить, что я поймал текущие изменения, а не предыдущие изменения, которые уже были обработаны. Я предполагаю, что проблема заключается в том, что выход из текстового поля без выбора элемента является допустимым и его нужно обрабатывать отдельно от выхода из текстового поля при выборе элемента, и я не могу понять, как определить, что происходит, если вы выбираете огонь после изменения. – Zarigani