Layui折叠面板无expand事件,需用click监听.layui-colla-title并判断$content.is(':visible')或getComputedStyle高度;change回调仅限手风琴模式且不响应收起操作。
collapse.on('expand') 不起作用?先确认是否用了正确的事件名
layui 的折叠面板(collapse)并没有 expand 这个内置事件,官方文档里也查不到。你搜到的 collapse.on('expand', ...) 多半是误传或混淆了其他 ui 库的写法。layui 本身不提供「展开/收起」的独立事件监听机制,得靠变通方式捕获。
真实可用的入口只有两个:layui.use('collapse') 初始化后,用原生 DOM 事件监听点击行为,或者利用 change 回调(仅限手风琴模式且需手动触发)。
如何用 click 事件准确捕获展开动作
折叠面板的标题栏(.layui-colla-title)是用户实际点击的目标,但要注意:一次点击可能对应展开,也可能对应收起——得靠判断当前状态来区分。
- 监听
.layui-colla-item下的.layui-colla-title元素的click事件 - 在回调里用
$(this).next('.layui-colla-content').is(':hidden')判断即将展开(true)还是即将收起(false) - 避免用
$(this).parent().hasClass('layui-colla-item-active'),因为 class 是异步添加的,时机不可靠 - 如果用了
accordion: true,注意其他已展开项会在当前点击后被收起,状态判断要放在setTimeout(..., 0)里才准
$('.layui-colla-title').on('click', function() {
const $content = $(this).next('.layui-colla-content');
setTimeout(() => {
if ($content.is(':visible')) {
console.log('已展开');
} else {
console.log('即将展开');
}
}, 0);
});
为什么不能直接监听 collapse.render 的回调
collapse.render() 的 change 参数只在 accordion: true 模式下生效,且仅当用户点击导致「当前激活项切换」时触发——也就是说,如果点的是同一个标题(比如已展开又点一次收起),change 根本不会执行。
-
change的参数是新激活项的索引(index),不是布尔值,无法区分展开/收起 - 非手风琴模式(
accordion: false)下,change完全无效 - 它不响应 JS 主动调用
collapse.update()或操作 DOM 的行为,只认用户点击
兼容性与性能提醒
如果你的页面用了 jQuery 3.6+,注意 :hidden 伪类在某些嵌套 display 变化下可能误判;更稳妥的方式是读取 getComputedStyle($content[0]).height 是否为 '0px'。
- 不要在每个
.layui-colla-title上重复绑定 click,用事件委托更安全:$(document).on('click', '.layui-colla-title', ...) - Layui 2.8+ 已弃用部分 jQuery 依赖,若你用的是纯原生引入(无 jQuery),得改用
Element.classList.contains和offsetHeight判断 - 折叠内容含异步加载或复杂组件时,展开后的回调时机比 DOM 显示晚,别在 click 后立刻操作子元素
最麻烦的地方在于:Layui 没暴露内部状态机,所有监听都得绕着 DOM 状态打转。一旦结构被第三方脚本修改,或者用了自定义主题覆盖了 class 名,这些判断就容易失效。


















