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

使用jQuery UI Autocomplete时输入值传参为null的问题

问题分析与解决方案

你遇到的核心问题很明确:前端AJAX请求传递的参数名,和后端代码试图获取的参数名完全不匹配,这才导致后端拿到的$name始终是null。

具体原因拆解

看你的JavaScript代码:

data: { term: request.term },

这里你把输入框的内容以term作为键名发送给了后端,但在PHP的search方法里,你却在尝试获取名为product-name的参数:

$name = $request->get('product-name');

这就好比你给快递填了收件人叫“张三”,却跑去问快递员有没有“李四”的包裹,自然找不到。你用$request->all()看到的["term" => "ban"]就是最直接的证据——后端确实收到了参数,只是你找错了名字而已。

两种可行的修正方案

你可以任选一种方案来解决这个问题:

方案一:修改后端代码(推荐)

既然jQuery UI Autocomplete的默认请求参数就是term,我们直接后端适配这个参数名即可,同时还能优化一下返回逻辑(没必要先转成JSON字符串再传给response()->json):

public function search(Request $request) {
    $name = $request->get('term'); // 把参数名改成term
    Debugbar::info($name);
    $result = DB::table('products')
                ->select('id', 'name')
                ->where('name', 'LIKE', '%' . $name . '%')
                ->limit(25)
                ->get();
    return response()->json($result); // 直接传集合,response()->json会自动转成JSON
}

方案二:修改前端JS代码

如果你更希望参数名和输入框的name属性保持一致,可以修改AJAX的data部分,同时优化前端的JSON解析逻辑(后端返回的已经是JSON,不需要手动JSON.parse):

$(document).ready(function() {
    $( "#product-name" ).autocomplete({
        source: function (request, response) {
            $.ajax({
                url: "add/search",
                data: { 'product-name': request.term }, // 把参数名改成product-name
                dataType: "json",
                success: function (data) {
                    var resp = $.map(data, function (obj) { // 去掉多余的JSON.parse
                        return { label: obj.name, value: obj.id }
                    });
                    response(resp);
                }
            });
        },
        minLength: 2
    });
});

补充提示

两种方案都能解决问题,但更推荐方案一,因为它符合jQuery UI Autocomplete组件的默认行为,后续其他开发者维护代码时也更容易理解,不需要额外适配自定义参数名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:32:52