layer.msg 的 time 参数必须显式设置,有效值为 0 或正整数(如 2000),其中 time: 0 是唯一官方确认的禁用自动关闭写法;传 false、null 或字符串均无效,且易与 shade、btn 等参数冲突导致失效。

layer.msg 的 time 参数怎么设才生效
不传 time 时,Layui 2.8+ 默认行为是「永不关闭」,但这个默认值不可靠——旧版本(如 2.5.x)默认为 3000 毫秒,且部分定制版会覆盖默认逻辑。所以必须显式传参,不能省略。
有效写法只有:time: 0(推荐)、time: 2000、time: 5000 等正整数;time: false、time: null、time: '3000' 全部无效。
-
time: 0是唯一被文档和源码双重确认的「禁用自动关闭」写法 -
time: -1虽在多数环境能用,但属于未声明的内部绕过,未来版本可能失效 - 传字符串(如
"2000")会导致定时器不启动,提示框一闪即逝或完全不关
设置了 time 却不关闭?常见冲突点
最常踩的坑不是参数写错,而是和其他配置打架。尤其是 shade 和 btn 这两个参数:
- 如果用了
btn: ['确定'],time会直接失效——有按钮就强制交互关闭,这是 layer.msg 的硬性规则 - 同时设
shade和time时,低版本 Layui(2.5.x 及之前)会跳过遮罩初始化,导致遮罩不显示或背景变黑。解决办法是把shade写成数组格式:shade: [0.3, '#000'] - 在
$.ajaxsuccess 回调里连续调两次layer.msg(),后一次会覆盖前一次,造成闪现。应加锁或改用tipsMore: true(仅限layer.tips)
想点击提示框本身立刻关闭,怎么配
layer.msg() 默认不响应点击关闭,得手动绑定事件。不能直接操作 DOM,因为提示框可能还没渲染完,或者已销毁。
正确做法是在 success 回调里绑定:
layer.msg('操作成功', {
time: 0,
closeBtn: 0,
shadeClose: false,
success: function(layero, index) {
layero.on('click', function() {
layer.close(index);
});
}
});- 必须设
closeBtn: 0和shadeClose: false,否则用户点叉号或遮罩就先关了,根本触发不到 click -
layero是弹层 DOM 元素,它支持 jQuery 风格的.on(),但前提是引入了 jQuery 或使用 Layui 自带的layui.jquery - 别在全局用
$('.layui-layer-msg').on('click')—— 类名不稳定,且多个 msg 实例会互相干扰
time 和异步回调配合时的关闭时机陷阱
很多人以为 layer.close(index) 执行完,DOM 就立刻没了。其实不是:它只是发起一个带淡出动画的异步销毁流程,DOM 移除有延迟。
如果你在 layer.close() 后马上清空表单或跳转页面,大概率报错:
- 用
end回调而不是success或直接写在close后面:layer.close(index); // ❌ 错误位置 - 正确监听销毁完成:
layer.close(index); layer.ready(function() { /* 此处安全 */ });,或更稳妥地用layer.close(index, function() { /* 动画结束后执行 */ }); - 注意:
layer.msg()本身不支持end配置项,那是layer.open()的,得靠layer.ready()或手动 setTimeout 做兜底
真正麻烦的不是设时间,而是当 time 和 shade、closeBtn、success 回调混在一起时,不同 Layui 小版本的行为差异会突然暴露出来。上线前务必在目标环境实测两轮:一次快速连点,一次鼠标悬停+遮罩点击。


















