应使用 input 事件监听搜索输入,配合 200ms 防抖;数据存 JS 数组并预配置搜索字段;数值和空值需安全转字符串再小写匹配;无结果时动态插入 colspan 正确的提示行;导出等操作须基于当前筛选结果而非原始数据。

用 input 事件监听,别用 keyup 或 change
用户敲字、粘贴、剪切、用输入法上屏——这些操作都得立刻响应,input 是唯一能覆盖全部场景的事件。用 keyup 会漏掉粘贴和 IME 输入;用 change 要等失焦,连续删改时明显卡顿。
加个 200ms 防抖更稳妥:避免每打一个字就重绘一次 DOM,尤其表格行数多时。IE11 不支持 input 事件?可 fallback 到 propertychange,但注意只在必要时启用。
数据存 JS 数组,别现场遍历 <tr> 和 <td>
DOM 查询慢,且 textContent 会把换行、空格、隐藏列、<span> 样式文本全混进来,匹配结果不可控。原始数据必须存在 JS 变量里,比如 tableData = [{ name: "张三", dept: "前端" }]。
过滤逻辑只跑这个数组,渲染用模板字符串一次性写入 <tbody>,别逐行 appendChild 或反复设 style.display。
立即学习“前端免费学习笔记(深入)”;
- 搜索字段用数组配置,如
searchFields = ["name", "dept"],方便后续加“角色”“状态”等新列 - 数值字段要先转字符串再
includes(),否则123.includes("2")直接报错 - 空值(
null/undefined)提前跳过,不参与比对,避免toLowerCase()崩溃
大小写统一转小写 + includes() 匹配
includes() 语义清晰、性能够用、兼容性好(IE 需 polyfill),比 indexOf() !== -1 少写判断,比正则安全——用户输 [ 或 . 不会触发语法错误。
统一转小写:用 row[field].toString().toLowerCase().includes(keyword.toLowerCase()),注意 toString() 必须加在前面,防止 null 或 undefined 报错。
无结果时动态插入提示行,别清空 <tbody>
清空 <tbody> 会让用户以为页面卡死或数据丢了。正确做法是保留表头,插入一行 <tr><td colspan="4">未找到匹配项</td></tr>,其中 colspan 值必须从 <thead> 动态读取列数,硬编码容易错。
还要区分两种空状态:tableData.length === 0 显示“暂无数据”,filteredData.length === 0 && keyword 才显示“搜索无结果”。导出按钮的数据源、页码总数、总条数显示——这些地方一漏,用户点导出就会导出全部原始数据,不是当前筛选结果。



















