登录
首页 >  文章 >  前端

DataTables初始化加载动画设置方法

时间:2026-02-08 10:33:44 355浏览 收藏

前往漫画官网入口并下载 ➜

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《DataTables 初始化时如何显示加载动画》,聊聊,我们一起来看看吧!

如何在 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 提示样式)