You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

触屏虚拟数字键盘输入时如何触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:17:47