最轻量方案是用JavaScript遍历tr和td配合includes()模糊匹配,需遍历每行所有td而非仅[0],跳过表头行,用input事件监听并trim过滤值,现代浏览器推荐toLowerCase().includes(),IE11需回退indexOf(),超2000行时应优化性能。
直接用 JavaScript 遍历 <tr> 和 <td>,配合 includes() 做模糊匹配,是最轻量、兼容性最好、也最容易调试的方案。不需要引入框架,不依赖后端,用户一输就响应——但前提是表格行数别超过 2000 行,否则卡顿明显。
getElementsByTagName("td")[0] 只搜第一列?很多现成代码里写 td = tr[i].getElementsByTagName("td")[0],本质是只取每行第一个 <td> 元素,也就是首列。输入 “Germany” 却搜不到 Country 列为 Germany 的行,就是这个原因。
<td>,不能只取 [0]
tr[i].getElementsByTagName("td") 拿到 HTMLCollection,再转数组(比如 [...tds])才能用 some()
<th> 或无 <td> 的 <tr>)要跳过,否则 tds.length === 0 会报错input 事件比 onkeyup 更可靠用 onkeyup 绑定函数,漏掉粘贴、语音输入、自动填充等场景;而 input 事件监听所有值变更,更健壮。
<input onkeyup="searchTable()">,改用 JS 注册:searchInput.addEventListener('input', searchTable)
filter = input.value.trim().toLowerCase()
includes() 比 indexOf() > -1 更易读,但 IE 不支持;如果项目还要兼容 IE11,得回退。
立即学习“前端免费学习笔记(深入)”;
txtValue.toLowerCase().includes(filter)
txtValue.toLowerCase().indexOf(filter) > -1
innerText:Safari 旧版对它支持不稳定,优先用 textContent
textContent 会把 <td>123</td> 转成字符串 "123",照常匹配真正容易被忽略的不是逻辑,而是性能临界点:当表格动态渲染了 3000+ 行,每次 input 都触发全量 DOM 遍历,UI 就会掉帧。这时候该考虑节流(setTimeout + 标志位)、或把数据抽成数组做纯 JS 过滤再重绘 tbody ——但那是另一个问题了。