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

Laravel框架下Ajax实现搜索自动补全时html()显单条、append()结果重复问题

Ajax实时搜索异常修复方案

问题根因

  • 调用.html()仅展示单条数据:.html()会覆盖目标元素的全部内容,你在遍历接口返回数据的循环中重复调用该方法,每一次遍历都会清空上一次渲染的内容,最终仅保留最后一条匹配数据。
  • 调用.append()出现结果叠加:每次触发搜索请求、新结果返回前,没有清空容器内的旧搜索结果,新内容直接追加在旧内容之后,导致重复展示。

修复代码

1. 前端Ajax逻辑修复

核心改动:每次渲染前先清空容器,先拼接所有结果的HTML字符串后再一次性写入DOM,同时修复原代码中a标签的语法错误,优化DOM操作性能。

$("#search-eng").keyup(function() {
    let search_query = $(this).val().trim();
    if (search_query != "") {
        $.ajax({
            url: '{{ url('/appointment/calander_patient_search') }}/' + search_query,
            type: "GET",
            dataType: "json",
            success: function(data) {
                // 先清空旧内容再显示容器
                const $list = $("#search-eng-show-list");
                $list.empty().show();
                let resultHtml = '';

                if (data.length > 0) {
                    // 循环拼接所有匹配结果
                    $.each(data, function(key, value) {
                        resultHtml += `<a data-id="${value.id}">${value.second_name}</a>`;
                    });
                } else {
                    resultHtml = '<a><i></i>No Record</a>';
                }
                // 一次性写入全部内容
                $list.html(resultHtml);
            },
        });
    } else {
        $("#search-eng-show-list").empty().hide();
    }
});

2. 后端控制器逻辑优化

原查询逻辑存在两个可优化点:一是select字段没有包含前端渲染需要的second_name,会导致前端取不到对应字段值;二是多条件模糊查询没有分组,存在逻辑优先级问题。

$patient = Patient::select('id', 'avatar', 'second_name')
    ->where(function($query) use ($search_query) {
        $query->where('phone_number', 'like', '%' . $search_query . '%')
              ->orWhere('first_name', 'like', '%' . $search_query . '%');
    })
    ->limit(15)
    ->get();
return $patient;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:36:00