如何让DeferRender在客户端处理模式下的DataTables中生效?
解决DataTables deferRender不生效的问题
我看你现在的核心问题是手动提前渲染了所有几千行数据到DOM中,这直接导致deferRender功能完全起不到作用——毕竟这个配置的意义就是让DataTables只渲染当前页面需要的行,其他行在需要时才动态生成,但前提是要让DataTables自己管理数据,而不是你提前把所有行都塞到tbody里。
解决方案步骤
- 移除手动构建HTML的
buildTable函数,改为让DataTables直接接收原始数据 - 明确启用
deferRender: true配置 - 通过DataTables的
columnDefs.render定义每列的自定义HTML内容(比如图片、链接) - 保留你原来的隐藏列、DOM布局等需求配置
修改后的完整代码
JavaScript部分
const url = 'https://raw.githubusercontent.com/________________.json'; $(document).ready(async function() { // 先异步获取数据 const response = await fetch(url); const evidenceData = await response.json(); // 让DataTables接管数据和渲染逻辑 var oTable = $('.mydatatable').DataTable({ "dom": "<t>ip>", // 保留你原来的DOM布局配置 "deferRender": true, // 启用延迟渲染 "pageLength": 10, // 自定义每页显示行数,按需调整 "data": evidenceData, // 传入原始数据数组 "columnDefs": [ // 保留你原来的隐藏列配置 { targets: [2, 3, 4], visible: false, searchable: true, }, // 自定义第0列(图片列)的渲染逻辑 { targets: 0, render: function(data, type, row) { const [country, title, category, date, link, image] = row; return `<a href="${link}" target='_blank'> <img class="tableThumbnail" src="${image}"> </a>`; } }, // 自定义第1列(标题列)的渲染逻辑 { targets: 1, render: function(data, type, row) { const [country, title, category, date, link, image] = row; return `<span class="tableTitle"> <a href="${link}" target='_blank'>${title}</a> </span>`; } }, // 隐藏列直接绑定原始数据 { targets: 2, data: 0 }, // 对应row里的country { targets: 3, data: 2 }, // 对应row里的category { targets: 4, data: 3 } // 对应row里的date ] }); // 绑定自定义搜索框功能(和你原来的需求一致) $('#searchInput').on('keyup', function() { oTable.search(this.value).draw(); }); });
HTML部分(仅调整thead列数匹配)
<head> <!-- 注意:移除重复的jQuery引入,避免版本冲突 --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> <!-- Datatables资源 --> <link rel="stylesheet" href="https://cdn.datatables.net/1.12.1/css/jquery.dataTables.min.css"> <script src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.min.js"></script> </head> <body> <form class="form"> <div> <input type="text" id="searchInput" class="form-control" placeholder=" Search"> </div> </form> <div class="main"> <table class="table mydatatable" id="mydatatable"> <thead> <tr> <th></th> <!-- 图片列 --> <th></th> <!-- 标题列 --> <th></th> <!-- 隐藏的country列 --> <th></th> <!-- 隐藏的category列 --> <th></th> <!-- 隐藏的date列 --> </tr> </thead> <tbody></tbody> <!-- 留给DataTables自动填充,不要手动插入内容 --> </table> </div> </body>
关键修改说明
- 放弃手动DOM渲染:不再把所有数据行提前生成HTML插入页面,而是让DataTables通过
data选项获取原始数据,按需渲染当前页的内容,这是deferRender生效的前提。 - 启用延迟渲染:明确设置
"deferRender": true后,DataTables只会渲染当前页面的行,初始DOM元素数量大幅减少,加载速度会明显提升。 - 保留原有功能:通过
columnDefs配置保留了隐藏列、搜索可搜索的特性,同时用render函数还原了你原来的图片、链接显示效果。 - 修复jQuery冲突:移除了重复引入的jQuery,避免版本冲突导致的潜在问题。
这样修改后,初始加载时只会渲染第一页的行(比如设置的10行),翻页或搜索后才会动态渲染对应页面的内容,既解决了加载慢的问题,又能正常支持搜索、筛选等交互操作。
内容的提问来源于stack exchange,提问作者kodikai
相关产品推荐
相关产品推荐

