问题
I'm using a JQuery
.autocomplete
class bound to an ASP.NET
form TextBox
widget.
The relevant code is the following:
var _hdnConvenzionato = null;
var _txtConvenzionato = null;
$(function () {
_hdnConvenzionato = $("input[id$='_hdnConvenzionato']");
_txtConvenzionato = $("input[id$='_txtConvenzionato']");
$.ajax({
type: "POST",
url: "/Service/WSDataService.asmx/GetConvenzionati",
dataType: "json",
data: "{}",
contentType: "application/json; charset=utf-8",
success: function (data) {
var datafromServer = data.d.split("<br />");
_txtConvenzionato.autocomplete({`enter code here`
source: datafromServer,
select: function (event, ui) {
var _data = _txtConvenzionato.val();
var _value = null;
// calculate _value
_hdnConvenzionato.val(_value);
_hdnConvenzionato.closest("form").submit();
}
});
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
}
});
});
The widget in subject is of course the one referenced _txtConvenzionato
.
The code works fine but the select
event handler is triggered only when _txtConvenzionato
lose its focus (I don't know if this's the standard behaviour but it sound strange to me).
Anyway I need it to trigger when a valid hit is found in the items menu.
How can I fix/modify this?
BTW I tried also handling change
event with similar results.
回答1:
I think your main issue is that you're trying to use _txtConvenzionato.val()
to get the selected value. The form element's value is updated after the select
event. Use the ui.item
from the event arguments to obtain the selected value.
A better approach (with a few more improvements):
// general-use "Ajax JSON POST" function, likely to be helpful in other places, too
$.postJSON = function (url, data, success) {
return $.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
success: success || null
});
};
var Convenzionati = $.postJSON("/Service/WSDataService.asmx/GetConvenzionati", {})
.then(function (data) {
return data.d.split("<br />");
})
.fail(function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
});
$(function () {
Convenzionati.done(function (items) {
$("input[id$='_txtConvenzionato']").autocomplete({
source: items,
select: function (event, ui) {
var _data = ui.item, _value;
// calculate _value ...
$("input[id$='_hdnConvenzionato']")
.val(_value)
.closest("form").submit();
}
});
});
});
Doing the $.postJSON
request before the $()
ensures that it starts loading as soon as possible, even before the rest of the page is ready - there is no need to wait for "document ready" to request the autocomplete items. We use the request's .then()
to transform the response (split at <br>
) for later use.
Inside the $()
we only react to the request's .done
, which will receive the already splitted items, and set up the autocomplete as soon as that's possible. This way your page initializing code and the autocomplete items can load in parallel.
来源:https://stackoverflow.com/questions/65412540/jquery-autocomplete-select-event-only-triggers-when-widget-loses-focus