Ich verwende die jQuery UI AutoComplete control (gerade aktualisiert zu jQuery UI 1.8.1). Wenn der Benutzer das Textfeld verlässt, möchte ich den Inhalt des Textfelds auf einen bekanntermaßen guten Wert setzen und ein ausgeblendetes ID-Feld für den ausgewählten Wert festlegen. Darüber hinaus möchte ich die Seite zurückgeben, wenn der Inhalt des Textfelds geändert wird.jQuery AutoComplete Auswahl Feuern nach Änderung?
Momentan implementiere ich dies, indem ich das Autocomplete-Select-Event die versteckte ID gesetzt habe und dann ein Change-Event auf das Textfeld setze, das den Textbox-Wert setzt und gegebenenfalls einen Post zurückbringt.
Wenn der Benutzer nur die Tastatur verwendet, funktioniert das perfekt. Sie können eingeben, verwenden Sie die Aufwärts- und Abwärtspfeile, um einen Wert auszuwählen, und dann die Tabulatortaste, um zu beenden. Das Auswahlereignis wird ausgelöst, die ID wird festgelegt und anschließend wird das Änderungsereignis ausgelöst und die Seite wird zurückgesendet.
Wenn der Benutzer mit der Eingabe beginnt und dann die Maus zur Auswahl der Autocomplete-Optionen verwendet, wird das Änderungsereignis ausgelöst (der Fokus wechselt zum Autocomplete-Menü?) Und die Seite wird zurückgeschrieben, bevor das Auswahlereignis festgelegt werden kann die ID.
Gibt es eine Möglichkeit, das Änderungsereignis erst nach dem ausgewählten Ereignis auszulösen, selbst wenn eine Maus verwendet wird?
$(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 : '');
}
});
});
Die Werte für die Textbox und die ausgeblendeten IDs werden von früheren Postbacks beibehalten, sodass ich keine einfache Möglichkeit feststellen kann, dass ich die aktuelle Änderung erfasst habe und nicht irgendeine frühere Änderung, die bereits behandelt wurde. Ich schätze das Problem ist, dass das Verlassen des Textfelds ohne Auswahl eines Elements gültig ist und getrennt vom Verlassen des Textfelds beim Auswählen eines Elements gehandhabt werden muss und ich nicht herausfinden kann, was passiert, wenn Auswahl nach Änderung ausgelöst wird. – Zarigani