table.exportFile 的 done 回调在导出触发完成(浏览器开始下载或失败)后立即执行,接收 res(恒为 true)和 msg(失败时为错误信息,成功时为空),仅用于轻量反馈,不可用于监听下载进度或读取 Blob。
table.exportFile 的 done 回调怎么用
layui 2.8+ 版本起,table.exportfile() 支持 done 参数,它是一个函数,在导出触发完成(即浏览器开始下载或失败)后立即执行。注意:这不是“文件写入完成”或“下载结束”的回调,而是“下载链接已生成并触发”的时机——此时文件未必真正下载完,但用户已看到下载行为。
常见错误是把它当成异步完成钩子,试图在里面读取 Blob 或监听进度,这行不通。它的作用仅限于:通知用户“导出已发起”,并做轻量反馈。
- 必须显式传入
done,不能依赖全局配置 - 回调接收两个参数:
res(始终为true)和msg(字符串,仅在失败时为错误信息,成功时为空) - 如果
msg为空,说明下载已由浏览器接管;非空则大概率是 MIME 类型不支持、路径异常或跨域拦截等前端可感知错误
自定义弹窗提示内容要避开哪些坑
直接调 layer.msg() 或 layer.alert() 看似简单,但容易被忽略的是:导出动作本身会触发页面重绘/焦点切换,部分浏览器(尤其是 Chrome 低版本)可能把弹窗压在下载面板下面,导致用户看不到。
更稳妥的做法是用带明确层级和自动聚焦控制的提示方式:
- 用
layer.tips()贴在导出按钮旁,避免遮挡下载面板 - 若坚持用
layer.msg(),加time: 2000和offset: 't'避免卡在底部 - 不要在
done里调layer.open({type: 1})这类模态框——它会阻塞下载流程,且与浏览器原生下载行为冲突 - 别依赖
msg判断成功与否:即使msg === '',也不能 100% 保证文件写入成功(比如磁盘满、杀毒软件拦截)
导出成功后想显示具体统计信息怎么办
done 回调拿不到导出行数、文件大小等元信息,Layui 不提供这些数据。真要展示“共导出 1246 条”,得在调用 table.exportFile() 前自己算好:
- 如果是导出选中行:
const checkStatus = table.checkStatus('yourId'); const count = checkStatus.data.length; - 如果是导出当前页:
const data = table.cache['yourFilter'] || []; const count = data.length; - 如果是导出全部(需后端配合):在发起导出前先请求一次总数接口,或从上次
done回调的res中提取(前提是你的parseData返回了count)
然后把 count 存到闭包或变量里,在 done 里拼进提示文字:layer.msg(`已发起导出,共 ${count} 条数据`);
为什么有时 done 根本不执行
最常见原因是:你没用对 API 形式。以下写法会导致 done 失效:
- 写了
table.exportFile('id', data, 'xlsx', { done: fn })—— 错,第 4 个参数是filename字符串,不是配置对象 - 写了
table.exportFile('id', data, { type: 'xlsx', done: fn })—— 错,table.exportFile()不接受对象作为第 3 个参数 - 正确写法只有两种:
table.exportFile('id', data, 'xlsx', filename, { done: fn })或table.exportFile('id', data, { type: 'xlsx', filename: filename, done: fn }) - 注意:Layui 2.8+ 才支持第二种对象写法;老版本只能用第一种,且
filename必须带扩展名
另外,如果导出数据为空数组([]),部分版本的 Layui 会跳过触发逻辑,done 也不执行——务必提前校验数据长度。











