table.checkstatus().data.length === 0 表示当前页无选中行,是最轻量可靠的判断方式;它不反映操作历史,需配合标志位区分“未操作”与“已取消全部”,且 reload 后恒为 0 属正常设计。

table.checkStatus().data.length === 0 就代表没选中任何行
直接看 table.checkStatus('yourTableId').data.length 是否为 0。这是最可靠、最轻量的判断方式,不需要遍历 DOM 或查 checkbox 状态。
注意:这个判断只反映「当前页」是否无选中项,和全选状态(isAll)无关。即使用户点了表头全选但还没加载完数据,data 仍可能是空数组 —— 此时 isAll 是 true,但 data.length 是 0。
- 必须确保表格已渲染完成,否则
checkStatus可能返回空对象或data: [](但这是正常初始态,不是错误) - 不要用
$("input[type=checkbox]:checked").length === 0,Layui 会动态销毁/重建 checkbox DOM,分页或 reload 后立即失效 - 如果表格用了
page: false(前端分页),data.length === 0才真正表示全表无勾选;否则它只是当前页无勾选
为什么 data.length === 0 不一定等于“用户没点过”
table.checkStatus() 返回的是当前 UI 映射出的选中快照,不是操作历史记录。它不区分「从未点选」和「点过又全取消」——两种情况都返回空数组。
如果你需要区分这两种语义(比如「首次进入工具栏显示『未选择』,点过再取消则显示『已取消全部』」),就得自己维护一个标志位:
- 在
table.on('checkbox(filter)', ...)里设hasUserInteracted = true - 用
data.length === 0 && hasUserInteracted判断「已取消全部」 - 用
data.length === 0 && !hasUserInteracted判断「尚未操作」
reload 后 data.length 还是 0,但这是预期行为
table.reload() 默认清空所有前端选中状态,所以调用后 checkStatus().data.length 必然为 0。这不是 bug,是 Layui 的设计逻辑。
若需保留选中状态,必须手动处理:
- reload 前缓存
table.checkStatus('id').data.map(d => d.id) - 在 reload 的
done回调里,遍历新table.cache['id'],对匹配 id 的行调用table.setRowChecked('id', {index: i, checked: true}) - 别忘了 reload 后再次触发一次 checkbox 监听逻辑,让工具栏数值同步
最容易被忽略的是:表格刚 render 完、还没触发任何 checkbox 事件时,checkStatus().data 就是空数组 —— 这个“零”是干净的初始态,不是错误信号,也不代表用户做了什么。别把它当异常去重置或报错。











