在使用 Layui 进行表格渲染时,接口请求失败几乎是无法完全避免的情况:后端服务宕机、跨域被拦截、请求超时、502 错误等,随时可能发生。面对此类问题,许多开发者的第一反应是“在 parseData 里做判断”,然而真正能在代码层面兜底的,其实只有一个统一入口:error 回调。 需要明确几个核心
error 回调。
需要明确几个核心要点:error 回调的参数 res 是一个原始的 xhr 对象,并非 JSON 结构。因此不要指望通过 res.msg 或 res.data 获取有用信息。真正能依靠的,是你在回调内部自己编写的 DOM 操作。
error 回调只在 xhr 状态异常或网络中断时触发。此时表格尚未渲染,DOM 是干净的,没有骨架屏或 loading 动画干扰。这个时机非常适合插入自定义提示信息和重试按钮。
具体实现时,有几个关键细节需要留意:

$(elem).empty() 清空容器。这一步不能省略,否则残留的骨架屏或 loading 元素会影响后续对 DOM 的控制。
- 如果配置了固定高度(例如 height: 400),清空后容器会保持该高度,按钮可能被挤压到底部甚至被截断。此时需要同步重置高度:$(elem).css('height', 'auto')。
- 按钮推荐使用 layui-btn 这个 class,以保证基础样式,再通过内联 style 微调垂直居中和边距。
parseData 未进入,done 也未触发。根本原因在于,parseData 只在响应体为合法 JSON 时执行——对于网页、空响应体、纯文本等,它都不会处理。
一个典型的漏掉场景是服务端宕机后返回空白页或 HTML 错误页。此时只有 error 回调会被触发,其他两个回调均静默跳过。
另一个常见误区是在 done 中检查 xhr.status 来替代 error。问题在于 done 的第三个参数 xhr 在失败时并不可靠,某些浏览器下它甚至为 null。因此这条路同样不可靠。
还需注意:error 回调内无法访问 this.elem。常用做法是将表格容器选择器提前存储在闭包变量中;或者从参数 res 的 srcElement 反推,但后者不推荐,因为跨浏览器行为不一致。
table.reload('id') 并不会重新发起请求,它不会自动读取之前设置的 url 和 where 参数。除非显式地将配置传进去。
稳妥方案是将原始配置对象存储在外部变量中,点击时完整执行重渲染。配置对象中必须包含 elem、url、cols 等必要字段,id 字段可选但建议加上,便于后续管理。
如果原配置中使用了函数式的 templet 或 toolbar,要确保它们在重渲染的作用域内仍可访问,避免闭包丢失导致报错。
重载前建议调用 table.clearCache('id')。Layui 2.8+ 版本必须传递 id 参数,否则缓存数据可能污染新请求。这一点容易被忽略,但后果明显:你以为刷新了数据,实际上浏览器返回的还是旧缓存。
按钮的事件绑定必须在 error 回调内部完成,否则多次渲染后容易导致事件重复绑定,造成点击一次触发多次请求。
error 回调的触发存在延迟,按钮可能在页面上短暂闪现后消失。解决方案是在插入按钮时加上 setTimeout 延迟 100 毫秒再操作,稳定性和视觉效果都更好。
如果表格容器是动态创建的(例如 tab 切换后才 append 到 DOM),error 触发时父级 DOM 可能尚未挂载。需要先确认容器确实存在,再执行 DOM 操作,否则插入按钮会报错。
使用模块化加载(layui.use(['table'], ...))时,要确保 table 实例在 error 执行时已经初始化完成,否则 table.reload 调用会报 undefined。
最后是按钮文案。不要偷懒写固定“重新加载”。搜索失败时写“重新搜索”,权限不足时写“请登录”——这些分支判断可以通过 res.status 或 res.statusText 实现,让用户体验更友好。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述