hidden属性最省心但兼容性受限:ie不支持,safari≤12对tr渲染不稳定;display:none最通用但恢复需写table-row;推荐class切换并配合:not(.tr-hidden)筛选;cms场景可用document.currentscript.closest('tr')精准定位。

用 hidden 属性最省心,但得注意兼容性
hidden 是 HTML5 原生布尔属性,设为 true 就等价于 display: none,语义清晰、代码干净:row.hidden = true 隐藏,row.hidden = false 显示。
它不占布局空间、不影响边框合并、屏幕阅读器自动跳过,且 table.rows 会实时排除它——统计时不会误算。
- IE 完全不支持;Safari ≤12 对
tr上的hidden渲染不稳定,可能残留空白行 - 若之前手动设过
row.style.display = 'none',恢复前必须先清内联样式:row.style.display = '',再设row.hidden = false - 别混用:
row.hidden = true和row.style.display = 'table-row'同时存在时,后者会被忽略
用 display: none 最通用,但恢复时别写错值
给 tr 设 style.display = 'none' 是兼容性最好的方式,所有浏览器都认。但恢复时不能写 'block' 或 'inline' —— 表格行默认是 table-row,写错就直接消失或错位。
- 安全写法:隐藏用
tr.style.display = 'none',恢复用tr.style.display = 'table-row' - 不确定原始值?用
getComputedStyle(tr).display读一次并缓存,比如存到tr.dataset.origDisplay - 千万别对
td或th单独设display: none—— 表格结构会崩,尤其有colspan时列宽错乱几乎必然发生
动态控制必须用 class 切换,别硬编码 style.display
直接操作 tr.style.display 看似快,但极易被外部 CSS 覆盖(比如 .table-striped tr:nth-child(odd) { display: table-row !important; }),而且无法统一管理状态。
- 定义 CSS:
.tr-hidden { display: none; } - JS 控制:
tr.classList.add('tr-hidden')/tr.classList.remove('tr-hidden') - 后续选择器可自然过滤:
table.querySelectorAll('tr:not(.tr-hidden) td'),避免统计时漏掉隐藏行 - 如果已有其他类(如
.collapsed)也控制display,确认它们没用!important锁死值
在 CMS/模板生成的表格里,用 document.currentScript.closest('tr') 定位当前行
当 HTML 是后端或 CMS 自动生成、没法加 id 或 class 时,这是唯一不依赖预设标识的精准方案。
脚本必须同步执行(无 async 或 defer),且放在 td 内:
<td>Fred <script>document.currentScript.closest('tr').hidden = true;</script>
</td>
-
document.currentScript在 Chrome 29+、Firefox 4+、Edge 13+、Safari 15.4+ 全支持;IE 不支持,但现代项目通常无需兼容 - 若需兼容 IE,降级用
document.scripts[document.scripts.length - 1].parentNode.parentNode(前提是script直接在td里) - 切勿用
nth-child()或索引定位——表格结构一变(比如新增表头行),就全错位
隐藏逻辑本身简单,真正容易出问题的是后续处理:统计时忘了过滤隐藏行、导出数据时混入被隐藏的 DOM、或者用 querySelectorAll('tr') 代替 table.rows 导致结果不一致。这些地方不显眼,但一出错就难排查。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











