前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)

一、项目背景与需求

在后台管理系统列表页面中,单一搜索已经无法满足业务需求,实际开发中几乎都是多条件联合筛选。

本次实战实现的功能:

  • 标题模糊搜索:输入关键词实时匹配列表标题;
  • 日历时间段筛选:选择开始时间、结束时间,筛选指定区间内的数据;
  • 双条件同时生效:标题 + 时间同时匹配;
  • 防抖优化:避免输入频繁触发搜索,提升页面性能;
  • 智能提示:搜索成功/无结果对应弹窗提示,空条件不弹窗;
  • 筛选后重载分页:根据筛选结果重新渲染列表。
    二、页面结构 HTML(日历搜索组件)
    包含自定义日历弹窗结构、隐藏域存时间、搜索展示文本,是典型的后台时间段筛选布局:

创建时间
开始时间 ~ 结束时间 📅
结构讲解 - 隐藏 input 框(startTime / endTime):不展示在页面,专门用来存储用户选择的时间,作为筛选条件; - date_input_box:展示用户已选的时间范围,默认显示占位文字; - calendar_popup:双层日历容器,实现左右双日历选择时间段。 三、核心 JS 逻辑(多条件防抖搜索) 实现:输入标题触发防抖搜索、选择时间后联动搜索、标题+时间双重匹配筛选。 // 全局数据源、定时器变量 let listData = \[\] // 所有原始列表数据 let currentEditId // 防抖定时器ID

// 1. 标题输入框监听,触发搜索

$('#titleb').on('input', function () {

doSearch();

});

// 2. 核心统一搜索函数(多条件联合筛选)

function doSearch() {

// 清除上一次定时器,实现防抖

clearTimeout(currentEditId);

复制代码
// 延迟900ms执行搜索,防止频繁触发
currentEditId = setTimeout(function () {
    // ========== 1. 获取所有搜索条件 ==========
    // 标题关键词
    let title = $('#titleb').val().trim();
    // 时间段
    let startTime = $('#startTime').val().trim();
    let endTime = $('#endTime').val().trim();

    // ========== 2. 多条件筛选数据 ==========
    let result = listData.filter(function (item) {
        // 条件1:标题模糊匹配
        let titleMatch = item.title.includes(title);

        // 条件2:时间匹配(默认放行,不选时间则不限制)
        let timeMatch = true;
        // 只有开始时间和结束时间都存在,才进行时间区间筛选
        if (startTime && endTime) {
            let itemTime = item.createtime;
            // 判断数据时间是否在选择的区间内
            timeMatch = itemTime >= startTime && itemTime <= endTime;
        }

        // 两个条件同时满足才算匹配成功
        return titleMatch && timeMatch;
    });

    // ========== 3. 搜索结果提示 ==========
    if (result.length === 0) {
        // 无匹配数据
        Toast.showError('没有搜索结果');
    } else {
        // 有搜索条件且匹配成功,弹出成功提示
        if (title || startTime || endTime) {
            Toast.showSuccess('搜索成功');
        }
    }

    // ========== 4. 重新渲染分页和列表 ==========
    initPagination(result);

}, 900);

}

// 模拟提示框、分页渲染函数

const Toast = {

showSuccess: (msg) => console.log("成功:" + msg),

showError: (msg) => console.log("失败:" + msg)

}

function initPagination(arr) {

console.log("最新筛选列表:", arr)

}

四、逐行核心逻辑超详细解析

  1. 防抖机制(900ms 延迟搜索)
    clearTimeout(currentEditId);
    currentEditId = setTimeout(function(){...},900)
    用户打字过程中会持续清除定时器,停止输入900毫秒后才执行一次搜索。大幅减少筛选次数,优化浏览器性能,比无防抖搜索更适合正式项目。
  2. 双条件联合筛选逻辑
    标题匹配
    item.title.includes(title):模糊查询,输入部分关键词即可匹配对应标题数据。
    时间匹配(核心重点)
  • 默认 timeMatch = true:用户不选择时间时,不限制时间,只按标题搜索;
  • 当 开始时间、结束时间同时存在 时,开启时间区间筛选;
  • 判断列表数据的创建时间 createtime 是否在所选区间内;
  • 最终返回 titleMatch && timeMatch:两个条件必须同时满足。
  1. 人性化提示逻辑
  • 筛选结果为空 → 固定提示「没有搜索结果」;
  • 筛选结果不为空,且用户输入/选择了条件 → 提示「搜索成功」;
  • 用户未输入任何条件、默认刷新页面 → 不弹出成功提示,避免干扰体验。
  1. 分页重载
    initPagination(result):将筛选后的全新数组传入分页函数,实现列表实时更新,是后台列表搜索的标准写法。
    五、功能亮点(面试/作业加分点)
  2. 多条件并行筛选:支持单独搜标题、单独搜时间、标题+时间组合搜索;
  3. 智能时间判断:不选时间则不限制时间区间,逻辑严谨;
  4. 防抖性能优化:900ms 延迟,兼顾流畅度与性能;
  5. 精准提示交互:空搜索、有结果、无结果区分提示,用户体验更好;
  6. 结构解耦:统一 doSearch() 函数,所有搜索入口共用一套筛选逻辑,便于维护。
    六、总结
    本次实现的 标题+日历时间段多条件防抖搜索 是企业级后台最常用的筛选方案:
  7. 通过隐藏域存储时间参数,配合双日历选择实现时间段筛选;
  8. 使用 filter 数组筛选 + includes 模糊匹配,完成标题搜索;
  9. 逻辑与运算 && 实现多条件同时生效;
  10. 定时器防抖解决高频输入卡顿问题;
  11. 统一封装搜索函数,代码复用性高,适合项目迭代开发。
相关推荐
武子康1 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
随心点儿2 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
一点一木2 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒3 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
kyriewen3 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
遇乐的果园4 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
用户985033593284 小时前
OpenLayers 热力图从原理到 Vue 组件一键接入
前端
颜酱4 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
hoLzwEge5 小时前
解码 IDE 智能提示:jsconfig.json 辅助开发全攻略
前端·前端框架