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

jQuery Autocomplete显示全部元素而非输入匹配结果问题求助

jQuery UI Autocomplete 无法过滤服务器返回结果的问题

我用jQuery UI实现自动补全功能,官方示例能正常运行,但从Spring服务器获取响应时,无论输入什么内容,组件都会显示全部元素,不会过滤匹配结果。

服务器端代码(Spring Controller)

List<String> data2 = new ArrayList<String>();   
data2.add("ActionScript");
data2.add("AppleScript");
data2.add("BASIC");
data2.add("Clojure");
data2.add("JavaScript");
data2.add("Python");
data2.add("Ruby");

@RequestMapping(value = "/invoiceNumberData2.html", method = RequestMethod.GET , produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<String> getLicenseNumber2(@RequestParam String term) {
    return data2;
}

前端代码

$(document).ready(function() {
    $("#licenseNumber").autocomplete({
        dataType: 'json',
        minLength: 3,
        source: function (request, response) {
            jQuery.get("/dltcEPay/secure/invoiceNumberData2.html", {
                term: request.term
            }, function (data) {
                console.log("Coming from server: " + data); 
                var JsonString = JSON.stringify(data);
                console.log("After converting to json array: " + JsonString);   
                var JsonObject = JSON.parse(JsonString);        
                console.log("After converting to json OBJECT: " + JsonObject);             
                response(JsonObject);
            });
        }
    });
});

问题现象

  • 前端直接传递响应数据时,出现错误:Uncaught TypeError: Cannot use 'in' operator to search for 'length' in ["ActionScript","AppleScript","BASIC","Clojure","JavaScript","Python","Ruby"]
  • 转换为JSON对象后错误消失,但自动补全始终显示全部选项,不会根据输入内容过滤。
  • 控制台输出:
Coming from server: ActionScript,AppleScript,BASIC,Clojure,JavaScript,Python,Ruby
After converting to json array: ["ActionScript","AppleScript","BASIC","Clojure","JavaScript","Python","Ruby"]
After converting to json OBJECT: ActionScript,AppleScript,BASIC,Clojure,JavaScript,Python,Ruby

解决方法

1. 后端实现过滤逻辑

当前后端仅原样返回全部数据,未根据前端传入的term参数做过滤,这是自动补全显示全部内容的核心原因。修改Spring Controller代码,添加过滤逻辑:

import java.util.stream.Collectors;

// ...

@RequestMapping(value = "/invoiceNumberData2.html", method = RequestMethod.GET , produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<String> getLicenseNumber2(@RequestParam String term) {
    // 过滤包含term(不区分大小写)的元素
    return data2.stream()
                .filter(item -> item.toLowerCase().contains(term.toLowerCase()))
                .collect(Collectors.toList());
}

2. 前端移除不必要的JSON转换

设置dataType: 'json'后,jQuery会自动将服务器响应解析为JSON对象,无需手动执行JSON.stringify和JSON.parse,多余的转换会引发类型异常。简化前端代码:

$(document).ready(function() {
    $("#licenseNumber").autocomplete({
        dataType: 'json',
        minLength: 3,
        source: function (request, response) {
            jQuery.get("/dltcEPay/secure/invoiceNumberData2.html", {
                term: request.term
            }, function (data) {
                console.log("服务器返回数据: ", data);
                // 直接将解析好的JSON数组传给response
                response(data);
            });
        }
    });
});

原理说明

jQuery UI Autocomplete的远程数据源模式下,组件会将输入内容通过term参数传递给服务器,必须由服务器端根据该参数过滤数据后返回,组件才会展示匹配结果。若服务器返回全部数据,组件自然会显示所有选项。

另外,前端的JSON重复转换操作完全多余,dataType: 'json'已告知jQuery自动解析响应为JSON对象,重复操作会导致数据类型异常,引发之前的类型错误。

内容的提问来源于stack exchange,提问作者user3067524

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:12:54