DataTables初始化加载动画设置方法
时间:2026-02-08 10:33:44
355浏览
收藏
您即将跳转至第三方网站,请注意保护好个人信息和财产安全!
继续访问
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《DataTables 初始化时如何显示加载动画》,聊聊,我们一起来看看吧!

本文介绍如何通过 processing: true 和 language.processing 配合 CSS 控制,彻底隐藏原始 HTML 表格的短暂闪现,确保 DataTables 完全初始化完成后再展示表格,并同步控制 D3 图表的渲染时机。
在 Django + DataTables + D3 的复合前端场景中,常见的“原始表格闪现”问题(即未初始化的
元素短暂可见,干扰 D3 动画)本质源于 DataTables 的初始化机制:它默认异步处理数据、重绘 DOM,但原始 内容在 JS 执行前已由 Django 模板引擎静态渲染到页面中。仅靠 initComplete 隐藏 wrapper 或切换 loading 指示器,无法阻止浏览器在 DataTables JS 加载/执行间隙渲染原始 HTML 表格。✅ 推荐解决方案:启用原生 processing 模式 + 精确控制图表渲染时机
DataTables 提供了内置的 processing 选项,它会在初始化期间自动显示加载提示,并强制隐藏原始表格内容(包括 和
),直到内部渲染完全就绪。这比手动控制 display/visibility 更可靠、更符合生命周期。✅ 正确配置方式(替换原有 DataTables 初始化代码)
$(document).ready(function () {
// 1. 表单提交时显示全局 loading 层(可选增强体验)
$('form').on('submit', function () {
$('#loading-indicator').show();
});
// 2. 初始化 DataTables —— 关键:启用 processing 并禁用原始表格可见性
var table = $('#example').DataTable({
processing: true, // ← 启用内置处理状态
language: {
processing: '<div class="dt-processing-spinner">' +
'<img src="{% static "loading.gif" %}" alt="Loading..." width="64" height="64">' +
'<br><small>Loading table data...</small>' +
'</div>'
},
// ⚠️ 移除 initComplete 中对 #example_wrapper 的 visibility 操作!
// 因为 processing 模式已接管显示逻辑,手动干预反而导致闪烁
// 其余配置保持不变(colReorder, scrollY, buttons 等...)
colReorder: true,
fixedColumns: false,
responsive: false,
paging: true,
scrollY: '40vh',
scrollX: true,
autoWidth: true,
pageLength: 15,
dom: 'Bfrtip',
buttons: [/* ... */],
columnDefs: [/* ... */]
});
// 3. 使用 DataTables 的 draw.dt 事件(或 once('draw.dt'))确保仅在首次渲染完成后触发 D3
table.on('draw.dt', function () {
// ✅ 此时 DataTables 已完全渲染完毕,且原始表格已被 processing 层覆盖
$('#loading-indicator').hide(); // 隐藏全局 loading 层
// ✅ 安全启动 D3 图表(避免与 DataTables 渲染竞争)
if (typeof createChart === 'function' && typeof drawDotChart === 'function') {
// 第一个图表
const assign_level_rawData = JSON.parse('{{ assign_levels|safe }}');
const data1 = assign_level_rawData.map(d => ({level_assign: d[0], count: d[1]}));
createChart(data1, "chart-level-assign", "Level of Assignment", "level_assign");
// 第二个图表
const edu_setting_rawData = JSON.parse('{{ edu_setting_levels|safe }}');
const data2 = edu_setting_rawData.map(d => ({edu_setting: d[0], count: d[1]}));
createChart(data2, "chart-edu-setting", "Educational Setting", "edu_setting");
// 第三个图表
const data3 = "{{ smd_combined_csv|escapejs }}";
const smd = d3.csvParse(data3).filter(d => d.smd_value !== "NA");
drawDotChart(smd);
}
// ⚠️ 移除重复绑定:确保只执行一次(可选)
table.off('draw.dt');
});
});? 必要的 CSS 补充(优化 loading 提示样式)
在