layer.load() 的 time 参数仅作超时兜底,非自动关闭定时器,必须手动调用 layer.close() 才能真正关闭;异步请求中需在 success 和 error 回调均执行关闭,否则 loading 会持续显示。
layer.load() 默认不自动关闭,必须手动调用 layer.close()
这是最常踩的坑:很多人以为给 layer.load() 加了 time 参数就能像 layer.msg() 那样自动关掉,但其实它只控制「最长等待时间」,不是「倒计时关闭」——超时后 layer 会自动销毁 loading 层,但前提是没被其他逻辑干扰。一旦你在 ajax 里忘了调用 layer.close(index),或者请求卡住、失败没兜底,loading 就一直转着不动。
-
layer.load(2, {time: 5000})表示:最多显示 5 秒,到点自动关;但如果 3 秒就拿到响应,你仍需主动layer.close(index),否则它不会提前消失 - 异步请求中,
layer.close(index)必须写在success和error两个回调里,缺一不可 - 如果用了
async: false(同步请求),会导致浏览器假死,layer 的动画/遮罩可能渲染异常,甚至time失效 —— 别这么干
time 参数在 layer.load() 中的实际作用
time 不是“延时关闭”,而是“最大存活时长”。它本质是个安全兜底机制,防的是请求发出去但永远没响应的情况。和 layer.msg() 的 time 语义不同,后者是“展示多少毫秒后自动消失”,前者是“等多久没结果就强制收工”。
- 不传
time:loading 会一直挂着,直到你手动layer.close(index) - 传了
time: 3000:3 秒内你没关,layer 自动帮你关;3 秒内你先关了,它就不再管 -
time对遮罩(shade)同样生效 —— 遮罩也会随 loading 一起消失
如何真正实现「加载完延时 1 秒再跳转」
这不是 layer.load() 能直接解决的,得组合使用:layer.load() 显示加载态 → 请求完成 → layer.close() 关掉它 → 再用 setTimeout() 延迟跳转。中间不能省略关闭步骤,否则新弹层或跳转可能被遮罩挡住。
var loading = layer.load(2, {shade: false, time: 10000});
$.ajax({
url: '/api/save',
type: 'POST',
data: formData,
success: function(res) {
layer.close(loading);
setTimeout(function() {
location.href = '/list';
}, 1000);
},
error: function() {
layer.close(loading);
layer.msg('保存失败', {icon: 2});
}
});
- 别把
location.href放进layer.load()的end回调 ——layer.load()没有end这个配置项,那是layer.open()才有的 - 如果想复用「关 loading + 延时跳转」逻辑,建议封装成函数,避免每次重复写
setTimeout - 注意:跳转前务必确认当前页面没有未提交表单或 unsaved 变更,否则用户可能丢失操作
为什么不用 layer.msg() 替代 loading?
因为语义和体验完全不同。layer.msg() 是瞬时提示,适合成功/失败反馈;而 layer.load() 是阻塞式等待态,带遮罩、禁交互,明确告诉用户「正在干活,请稍候」。混用会导致用户困惑:比如保存接口耗时 800ms,你用 msg 显示「提交中…」3 秒,实际早就完了,后面 2.2 秒纯属空等。
- loading 适合真实异步耗时场景(上传、导出、复杂计算)
- msg 适合轻量反馈(校验通过、删除成功)
- 强行用
msg模拟 loading,会失去遮罩保护,用户可能重复点击按钮
关键点就落在「layer.load() 的 time 是保底不是定时器」—— 它不替代你的业务逻辑闭环,该关还得关,该延还得自己 setTimeout。漏掉这一步,loading 就成了悬停幽灵。










