一、项目背景与需求
在后台管理系统列表页面中,单一搜索已经无法满足业务需求,实际开发中几乎都是多条件联合筛选。
本次实战实现的功能:
- 标题模糊搜索:输入关键词实时匹配列表标题;
- 日历时间段筛选:选择开始时间、结束时间,筛选指定区间内的数据;
- 双条件同时生效:标题 + 时间同时匹配;
- 防抖优化:避免输入频繁触发搜索,提升页面性能;
- 智能提示:搜索成功/无结果对应弹窗提示,空条件不弹窗;
- 筛选后重载分页:根据筛选结果重新渲染列表。
二、页面结构 HTML(日历搜索组件)
包含自定义日历弹窗结构、隐藏域存时间、搜索展示文本,是典型的后台时间段筛选布局:
// 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)
}
四、逐行核心逻辑超详细解析
- 防抖机制(900ms 延迟搜索)
clearTimeout(currentEditId);
currentEditId = setTimeout(function(){…},900)
用户打字过程中会持续清除定时器,停止输入900毫秒后才执行一次搜索。大幅减少筛选次数,优化浏览器性能,比无防抖搜索更适合正式项目。 - 双条件联合筛选逻辑
标题匹配
item.title.includes(title):模糊查询,输入部分关键词即可匹配对应标题数据。
时间匹配(核心重点)
- 默认 timeMatch = true:用户不选择时间时,不限制时间,只按标题搜索;
- 当 开始时间、结束时间同时存在 时,开启时间区间筛选;
- 判断列表数据的创建时间 createtime 是否在所选区间内;
- 最终返回 titleMatch && timeMatch:两个条件必须同时满足。
- 人性化提示逻辑
- 筛选结果为空 → 固定提示「没有搜索结果」;
- 筛选结果不为空,且用户输入/选择了条件 → 提示「搜索成功」;
- 用户未输入任何条件、默认刷新页面 → 不弹出成功提示,避免干扰体验。
- 分页重载
initPagination(result):将筛选后的全新数组传入分页函数,实现列表实时更新,是后台列表搜索的标准写法。
五、功能亮点(面试/作业加分点) - 多条件并行筛选:支持单独搜标题、单独搜时间、标题+时间组合搜索;
- 智能时间判断:不选时间则不限制时间区间,逻辑严谨;
- 防抖性能优化:900ms 延迟,兼顾流畅度与性能;
- 精准提示交互:空搜索、有结果、无结果区分提示,用户体验更好;
- 结构解耦:统一 doSearch() 函数,所有搜索入口共用一套筛选逻辑,便于维护。
六、总结
本次实现的 标题+日历时间段多条件防抖搜索 是企业级后台最常用的筛选方案: - 通过隐藏域存储时间参数,配合双日历选择实现时间段筛选;
- 使用 filter 数组筛选 + includes 模糊匹配,完成标题搜索;
- 逻辑与运算 && 实现多条件同时生效;
- 定时器防抖解决高频输入卡顿问题;
- 统一封装搜索函数,代码复用性高,适合项目迭代开发。