触屏虚拟数字键盘输入时如何触发JQuery AJAX自动补全功能——问题求助
解决虚拟键盘输入无法触发jQuery Autocomplete自动补全的问题
首先我得指出你代码里的几个核心问题,这也是虚拟键盘无法触发自动补全的主要原因:
问题1:Autocomplete初始化逻辑错误
你把Autocomplete的初始化代码放在了txtLookup的keyup事件里,这意味着只有实体键盘触发keyup时,才会重新创建一次Autocomplete实例。当虚拟键盘插入文本后,即使你尝试触发keyup或调用search方法,要么Autocomplete实例还没正确初始化,要么重复初始化导致实例混乱,自然无法正常触发自动补全。
问题2:AJAX数据格式语法错误
在tagNo分支的AJAX请求里,你拼接的JSON字符串有语法错误:
data: '{"lookup:"' + textCheck + '}'
这里的lookup键没有闭合引号,正确的写法应该是'{"lookup":"' + textCheck + '"}',或者更可靠地用JSON.stringify来生成,避免手动拼接出错。
解决方案
我们需要重构代码,把Autocomplete的初始化逻辑从keyup事件中抽离出来,只初始化一次;同时在虚拟键盘插入文本后,直接调用Autocomplete的搜索方法。
1. 重构jQuery Autocomplete代码
把Autocomplete初始化移到document.ready中,只执行一次,在source函数内根据当前的lookupType选择对应的AJAX接口:
$(document).ready(function () { // 只初始化一次Autocomplete实例 $(".autosuggest").autocomplete({ source: function (request, response) { var textCheck = $("#txtLookup").val(); var lookupType = $("#txtLookupType").val(); if (lookupType === "tagNo") { $.ajax({ type: "POST", url: "Inventory.aspx/GetAutoCompleteData", data: JSON.stringify({ lookup: textCheck }), // 用JSON.stringify避免语法错误 contentType: "application/json;charset=utf-8", dataType: "json", success: function (data) { response(data.d); }, error: function (ts) { console.error("TagNo自动补全请求失败:", ts.responseText); } }); } else if (lookupType === "lotNo") { $.ajax({ type: "POST", url: "Inventory.aspx/GetAutoCompleteData3", data: JSON.stringify({ lookup: textCheck + '%' }), contentType: "application/json;charset=utf-8", dataType: "json", success: function (data) { response(data.d); }, error: function (ts) { console.error("LotNo自动补全请求失败:", ts.responseText); } }); } else { response([]); // 没有匹配类型时返回空数组 } }, minLength: 2, }); // 实体键盘的keyup事件可以保留(可选),如果需要确保输入后立即搜索,也可以去掉,Autocomplete会自动监听输入 $("#txtLookup").on("keyup", function () { // 可选:强制触发搜索 // $(".autosuggest").autocomplete("search", $(this).val()); }); });
2. 修改虚拟键盘点击事件代码
在插入文本后,直接调用Autocomplete的search方法,传入文本框的最新值。另外注意用ASP.NET的ClientID获取正确的控件ID(避免因为命名容器导致渲染后的ID变化):
if (object.id === "imgNum1") { var x = "1"; // 用ClientID确保获取到正确的文本框元素 var textObj = document.getElementById('<%= txtLookup.ClientID %>'); insertTextAtCursor(textObj, x); textObj.focus(); document.getElementById("txtLastClickedBtnValue").value = ''; // 直接调用Autocomplete的search方法,传入当前文本值 $(".autosuggest").autocomplete("search", textObj.value); }
额外注意事项
- 检查
insertTextAtCursor函数是否正确更新了文本框的值,没有阻止任何必要的事件。 - 打开浏览器控制台(F12),查看是否有AJAX请求失败的报错,或者Autocomplete相关的错误信息。
- 如果你的页面有多个文本框使用
autosuggest类,确保选择器不会影响其他元素,必要时可以用更精确的选择器(比如基于txtLookup的ClientID)。
内容的提问来源于stack exchange,提问作者Wonderland Alice
相关产品推荐
相关产品推荐

