javascript - JQuery .autocomplete() 选择事件仅在小部件失去焦点时触发
问题描述
我正在使用JQuery
.autocomplete
绑定到ASP.NET
表单TextBox
小部件的类。相关代码如下:
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);
}
});
});
主题中的小部件当然是引用的那个_txtConvenzionato
。代码工作正常,但select
只有在失去焦点时才会触发事件处理程序_txtConvenzionato
(我不知道这是否是标准行为,但对我来说听起来很奇怪)。无论如何,当在项目菜单中找到有效命中时,我需要它触发。我该如何修复/修改这个?顺便说一句,我也尝试处理change
具有类似结果的事件。
解决方案
我认为您的主要问题是您试图用来_txtConvenzionato.val()
获取所选值。表单元素的值在事件发生后select
更新。使用ui.item
from 事件参数来获取选定的值。
一种更好的方法(还有一些改进):
// 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();
}
});
});
});
$.postJSON
在请求之前执行请求$()
可确保它尽快开始加载,甚至在页面的其余部分准备好之前 - 无需等待“文档准备好”来请求自动完成项目。我们使用请求.then()
来转换响应(在 处拆分<br>
)以供以后使用。
在内部,$()
我们只对请求做出反应.done
,它将接收已经拆分的项目,并尽快设置自动完成。这样,您的页面初始化代码和自动完成项可以并行加载。
推荐阅读
- long-path - 在 Windows 10 主页上启用长路径
- python - 如何在 countvectorizer 中使用 max_features 参数对某些特征进行优先级排序
- ios - 在不同机器上的 M1 反应本机(firebase)上构建失败
- javascript - 在没有 webpack 的情况下使用 PhysxJS——没有碰撞物理工作
- oracle - 将 OWB11gR1(11.1.0.7) 升级到 OWB11gR2(11.2.0.4) 时,存储库创建失败
- javascript - JSDoc如何在自动完成对话框中获取参数/道具评论?
- android - app vss异常VmSize是什么意思
- javascript - 向所有覆盖的元素发送 mouseover 事件
- ios - 关闭视图及其父视图(Xcode 13 beta 5、iOS 15、SwiftUI 3)
- c - C 中的 Project Euler 问题 11 不提供任何输出