最可靠方法是手动维护弹窗索引数组并实时增删:声明全局数组openlayerindexes=[],每次layer.open()后push返回值,关闭时同步splice或清空,总数即openlayerindexes.length。

要准确统计当前页面上所有已打开的 layui layer 弹窗数量,不能依赖 layer.index 或 DOM 元素个数——因为 layer.index 只保存最新弹窗索引,而 DOM 中可能残留已关闭但未清理的节点。
最可靠:手动维护弹窗索引数组并实时计数
这一步是唯一能跨版本、跨类型(dialog/page/iframe/loading/tips)稳定获取真实打开数量的方法。
第一步:声明一个全局数组用于记录所有活跃弹窗索引
【必须在 layer.open() 调用前初始化】,否则首次打开时 push 会报错:
const openLayerIndexes = [];
第二步:每次调用 layer.open() 后,立即将返回值存入数组
例如:const index = layer.open({ type: 2, content: 'page.html' }); openLayerIndexes.push(index);
第三步:每次关闭弹窗(无论用 layer.close(index) 还是 layer.closeAll())后,同步清理数组
单个关闭时需定位并移除:const i = openLayerIndexes.indexOf(index); if (i > -1) openLayerIndexes.splice(i, 1);
全部关闭时直接清空:layer.closeAll(); openLayerIndexes.length = 0;
第四步:获取当前总数,直接读取数组长度即可
console.log('当前打开弹窗数:', openLayerIndexes.length); —— 这就是你要的精确数字。
替代方案:通过 DOM 查询 iframe 类型弹窗数量(仅限 type:2)
该方法只适用于 iframe 层,且无法识别 dialog/msg/loading/tips 等类型,慎用。
方法一:查 .layui-layer-iframe 类的可见弹窗
document.querySelectorAll('.layui-layer-iframe:not(.layui-layer-hide)').length
注意:此结果不包含已打开但被隐藏(hideOnClose: true)的弹窗,也不含非 iframe 类型。
方法二:查所有 .layui-layer 元素再过滤掉隐藏态
document.querySelectorAll('.layui-layer:not(.layui-layer-hide)').length
⚠️ 风险提示:Layui 内部可能复用 DOM 节点或延迟销毁,这个数值在快速开关、嵌套弹窗场景下容易虚高,【不可作为业务逻辑判断依据】。
绝对不可用的方法
直接读 layer.index —— 它只是一个自增计数器,永远只等于最后一次 open() 返回的值,和“当前打开数量”完全无关。
遍历 layer.cache —— 该对象存储的是各弹层配置快照,但 key 是字符串索引(如 "1000"),没有统一标识是否仍处于打开状态;且 loading/tips 类型不进 cache。
监听 window.layerIndex 变化 —— 该属性根本不存在,属常见误传。











