layer.cache 是唯一能拿到所有打开层的实时缓存,它是 layui 内部维护的键值对象,key 为层 ID,value 为完整配置;虽方便但属内部状态,生产环境更推荐手动维护 openLayerIndexes 数组。
layer.cache 是唯一能拿到所有打开层的实时缓存
layui 没有 layer.getalllayers() 这样的官方 api,layer.index 只存最新层的 id,layer.getframeindex() 仅在 iframe 子页内有效,两者都不能列出全部。真正能反映当前所有未关闭层状态的,只有 layer.cache —— 它是 layui 内部维护的键值对象,key 是层 id(数字),value 是该层完整配置。
实操建议:
- 直接遍历:
Object.keys(layer.cache).map(id => layer.cache[id]) - 过滤脏数据:检查
layer.cache[id].close是否为函数,或用$('#layui-layer' + id)确认 DOM 是否还存在 - 注意版本:Layui 3.1.1+ 中
layer.cache是公开可用的;2.x 版本可能需回退到layer.index或自行维护栈
手动维护 openLayerIndexes 数组最稳定可靠
依赖 layer.cache 虽然方便,但它属于内部状态,文档未承诺长期兼容。生产环境更推荐主动管理:每次 layer.open() 后把返回的 index 推入全局数组,关闭时同步移除。
关键点:
- 不要用
layer.index初始化数组——它只是计数器,不是历史快照 - 调用
layer.closeAll()后必须手动清空数组,否则状态脱节 - 跨 iframe 场景下,父页和子页要各自维护自己的数组,不能共享
parent.layer.index - 示例中
openLayerIndexes.push(index)和openLayerIndexes.splice(i, 1)必须成对出现
DOM 查询可临时应急,但不建议用于生产
当无法修改原有逻辑又急需排查时,可以用 jQuery 扫描 DOM:$('[id^="layui-layer"]') 提取 ID 中的数字。但这方法有硬伤:
- Layui 2.8+ 启用 zIndex 随机化后,ID 不再严格按顺序生成,
layui-layer123这类命名不可靠 - 部分层(如
layer.msg())可能不生成独立 ID 元素,漏检 - 依赖 jQuery 和特定 DOM 结构,模块化或无 jQuery 环境下失效
iframe 层里想访问父页 layer 实例?别绕远路
子页不需要“获取父页所有 layer 对象”,而是直接调用 parent.layer 即可。比如子页要关自己:parent.layer.close(parent.layer.getFrameIndex(window.name));要关其他层:parent.layer.close(某个 index)。
注意:
-
parent.layer.getFrameIndex(window.name)是子页唯一安全获取自身 index 的方式,不是用来列全部层的 - 子页不能直接读
parent.layer.cache,跨域 iframe 下会报错 - 如果父页用了手动维护的
openLayerIndexes,需显式暴露给子页(如挂到window.parentOpenIndexes),且注意同源限制
layer.cache 快速 inspect,或坚持手动维护数组,才是可控的做法。别在 runtime 里反复查 DOM,也别指望未来版本突然加个 getAll()。











