layui 2.8+ 中 layer.msg 的 time 默认为 0(永不关闭),必须显式设置如 time: 2000 才生效;旧版默认 3000,且小于 100 的值会被忽略,shade 需用数组格式 [0.3, '#000'] 才可靠。
layer.msg 的显示时间不是“设了就生效”,关键看版本和参数组合。layui 2.8+ 默认 time: 0(永不关闭),而旧版(如 2.5.x)默认是 3000;直接写 time: 2000 只有在显式传入时才起作用,不传反而挂住。
layer.msg 的 time 参数在不同版本中行为不一致
这不是你代码写错了,是文档没同步、版本没对齐导致的典型问题:
- Layui ≤ 2.7.x:不传
time时默认3000(3 秒),time: 0和time: -1都表示常驻 - Layui ≥ 2.8.0:不传
time时默认0(即永不关闭),必须显式写time: 2000才会 2 秒后关 - 小于
100的值(如time: 50)会被底层忽略,最小有效阈值就是100 - 查当前版本:控制台执行
layui.version,别信“别人说的默认值”
设置 time 后遮罩(shade)失效或样式错乱
这是混用 shade 和 time 时最常踩的坑,尤其在 2.5.x ~ 2.7.x 版本中:
-
time非零时,Layui 会跳过部分遮罩初始化逻辑,导致shade: 0.3不生效或背景变黑块 - 正确写法必须用数组格式:
{ shade: [0.3, '#000'] },单数字写法shade: 0.3在 combo 场景下大概率失效 - 若仍异常,优先换
layer.open({ type: 1 })替代,它对shade支持更稳 - 别依赖
shadeClose: true单独工作——它只在shade存在且可点击时才响应,透明度低于0.1基本点不动
连续快速调用 layer.msg 导致闪退或覆盖
不是提示框“没显示”,而是上一个还没销毁,下一个就盖上去,视觉上像闪一下就没了:
- AJAX 成功回调里连写三次
layer.msg('ok'),极大概率只看到最后一次,前两个被吞掉 - 解决方案不是加
setTimeout,而是用tipsMore: true(仅限layer.msg,非全局配置) - 更稳妥的做法:手动记录上一个索引,关掉再开:
if (lastIndex) layer.close(lastIndex); lastIndex = layer.msg(...) - 图标加载异步,
time: 500会导致文字刚出、图标未渲染就关闭,带icon至少设time: 1500
回调函数执行时机与 DOM 安全边界
layer.msg 的回调只在关闭“瞬间”触发,不等动画结束,也不保证 DOM 还在:
- 回调里写
$('#form')[0].reset()没问题,但写$('#form').submit()可能因页面已跳转而失败 - 重定向前调用
layer.msg,提示框大概率被强制销毁,且不触发回调 - 想区分关闭方式?Layui 不暴露关闭来源,只能自己接管:
const index = layer.msg('...'); layer.close(index),这样你知道是脚本关的 - 回调里避免同步耗时操作(如遍历万级数组),否则 UI 卡住,看起来像“没关成功”
真正麻烦的从来不是怎么写 time: 2000,而是当它和 shade、shadeClose、AJAX 回调、页面跳转搅在一起时,不同小版本的行为差异才会突然冒出来。上线前务必在目标环境实测两轮:一次快速连点,一次鼠标悬停+遮罩点击。











