必须用 input 事件,因它覆盖粘贴、语音、自动填充等所有输入场景;keyup 不触发粘贴等操作,change 需失焦才响应。

直接监听 input 事件、用 JS 遍历 tbody tr、匹配时统一转小写并 trim(),就能让搜索动起来——不需要框架,但漏掉任一细节,用户一输就卡或搜不到。
为什么必须用 input 而不是 keyup 或 change
用户粘贴文本、用语音输入、触发浏览器自动填充时,keyup 根本不触发;change 要等失焦才执行,中间删改完全无响应。只有 input 事件能覆盖所有输入途径,值一变就捕获。
- 写法必须是
searchInput.addEventListener('input', filterRows),别写onkeyup="filterRows()" - IE11 不支持
input?加 fallback:searchInput.addEventListener('propertychange', filterRows) - 防抖建议加:延迟 200ms 再执行
filterRows,避免每敲一个字都重刷 DOM
怎么安全遍历表格行,避开兼容性陷阱
别用 getElementsByTagName('tr'),它会把 thead 行也混进来;也别依赖浏览器自动补 tbody,旧版 Safari 可能根本不生成它。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- HTML 中必须显式写出
<tbody>,不能省略 <li>JS 中用 <code>table.querySelectorAll('tbody tr')获取有效数据行 - 遍历时跳过
row.cells.length === 0的行(比如空行或纯表头) - 500+ 行时,提前缓存单元格文本:
const rowData = Array.from(rows, r => Array.from(r.cells).map(c => c.textContent?.trim() || '')),后续只操作数组,不反复读 DOM - 先统一提取关键词:
const keyword = searchInput.value.trim().toLowerCase() - 对每个
cell.textContent?.trim()?.toLowerCase()单独调用includes(keyword) - 遇到
null或undefined必须提前 guard,比如c.textContent?.trim() || '' - 数值字段要转字符串再比:
String(rowData.age).includes(keyword),否则123.includes("2")直接报错 - HTML 中给搜索框加
data-target="#user-table"或data-target=".order-table" - JS 中用
document.querySelectorAll('[data-target]')批量绑定,每个input只控制自己target指定的表格 - 空搜索时,别只恢复显示,还要清空
tr.style.display并选中搜索框内文字:searchInput.select(),方便用户连续修改 - 无结果时插入提示行:
<tr><td colspan="${table.rows[0].cells.length}">未找到“${keyword}”</td></tr>,colspan必须动态读取,不能硬编码
匹配逻辑怎么写才不漏列、不崩、不卡
只比第一列?那“张三”在第二列就永远搜不到。整行拼接再 includes?中文数字白转,还拖慢性能。正确做法是逐单元格处理。
多表格共存时如何避免互相干扰
全局查 document.getElementById('myTable') 是最常见翻车点——一个搜索框一动,所有表格全刷新。
最容易被忽略的是数据源与视图不同步:过滤后只更新了 tbody 显示,却忘了同步页码总数、导出按钮的数据源、甚至排序状态——用户点导出,拿到的还是原始全部数据。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










