原生JavaScript实现表格搜索无需框架,应监听input事件、用querySelectorAll获取tbody行、缓存textContent提升性能、trim搜索词并合理设置display。

直接用原生 JavaScript 就能搞定,不需要 jQuery 或框架,代码轻、兼容好、改起来快。
监听 input 事件而不是 keyup
很多人习惯写 keyup,但用户用粘贴、语音输入、剪贴板操作时,keyup 不会触发。用 input 事件才能捕获所有文本变更。
-
input事件在值真正变化后立即触发,包括 paste、drag-drop、autocomplete 填充 - 避免写成
change,它只在失焦时触发,搜索体验断层 - 如果表格行数超 200 行,建议加
setTimeout节流,防止每敲一个字都重刷 DOM
遍历 tbody 的 tr,跳过 thead
表格结构里 两者都能用,但 如果表格有 500+ 行,每次搜索都调用 最易被忽略的一点:搜索框焦点管理。用户清空输入后,所有行应恢复显示,但很多实现忘了重置 是表头, 才是数据主体。直接用
document.querySelectorAll('#my-table tbody tr') 拿到所有数据行,比用 getElementsByTagName('tr') 再手动过滤更安全。
rows[0] 这种索引判断表头——万一有 colspan 合并的复杂表头,索引就错乱了,否则某些浏览器(如旧版 Safari)可能不生成该元素,导致
querySelectorAll('tbody tr') 返回空列表
row.style.display = 'none',显示用 row.style.display = ''(不是 'table-row'),避免覆盖 CSS 中定义的 display 类型匹配逻辑:用 includes 还是 indexOf?
includes() 更直观、可读性高,且现代浏览器(Chrome 41+、Firefox 40+、Edge 12+)全部支持,不用 polyfill。
textContent 直接 toLowerCase() 后匹配——中文、数字、符号大小写不变,但转换开销白费;只需对搜索词和目标文本分别转小写即可cells[0].textContent 和 cells[1].textContent 分别判断trim() 清理搜索词性能卡点:大表格下别反复查 DOM
cells[i].textContent 会触发多次 layout 计算,肉眼可见卡顿。
const rowData = Array.from(rows, r => r.textContent),搜索时只操作这个数组querySelector 或 getElementsByTagName,它们都是 live collection,开销大display,导致部分行永久消失——务必在搜索词为空时显式设回 '',别依赖初始状态。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











