DataTable v2.0.6空数据返回时初始化异常,加载状态无法消除
DataTables 2.0.6 升级后问题解决:加载状态无法结束、自定义下拉框无法插入
一、表格一直处于加载状态的问题
核心原因
DataTables 2.0+ 对服务端模式(serverSide: true)的draw参数校验变得严格:前端发起请求时会自动生成递增的draw值(从1开始),后端必须返回与请求完全一致的draw值,否则表格会判定请求未完成,持续显示加载状态。
你的后端返回固定draw: 0,不符合2.0版本的要求——v1.10对这个参数的校验较宽松,所以之前能正常工作。
解决方法
修改后端逻辑,将前端请求中的draw参数原封不动返回,比如:
如果前端请求的draw是1,后端返回:
{"draw":1,"recordsTotal":0,"recordsFiltered":0,"data":[]}
额外建议:更新配置为DataTables 2.0标准命名
旧版本的配置前缀(sDom、bSort、bSortable、mRender、sClass)虽然兼容,但推荐换成2.0的标准命名,避免潜在兼容问题:
sDom→dombSort→orderingbSortable→orderablemRender→rendersClass→className
二、init.dt事件中下拉框无法添加到表格顶部的问题
核心原因
- DOM结构变化:DataTables 2.0重构了表格容器的DOM结构,你原来的选择器
#tableId_wrapper .filter .selection对应的元素不存在。 - HTML语法错误:插入的
<option>标签未正确闭合(<option value="option1"></option<option>少了</option>)。
解决方法
- 修正DOM选择器:通过浏览器控制台查看表格容器的实际结构,2.0版本顶部操作栏通常在
.dt-top-container或.dt-top-row下。示例代码改为:
$("#tableId").on("init.dt", function() { // 插入到顶部操作栏的最前面 $("#tableId_wrapper .dt-top-row").prepend(` <div class="filter"> <div class="selection"> <select> <option value="" selected>Select</option> <option value="option1">Option 1</option> <option value="option2">Option 2</option> </select> </div> </div> `); });
- 修正HTML语法错误:确保所有标签正确闭合,避免解析异常。
可选优化:改用draw.dt事件
如果init.dt触发时机不符合预期,可以换成draw.dt事件(表格每次绘制完成都会触发),确保DOM元素已完全生成。
修改后的完整初始化代码示例
window.tableInit = function() { var $table = $('#tableId').DataTable({ paging: true, serverSide: true, searching: true, pageLength: 10, responsive: true, processing: true, pagingType: 'simple_numbers', lengthMenu: [[5, 10, 25, 50], [5, 10, 25, 50]], ajax: { url: 'url here', type: 'POST' }, columns: [ { data: 'id' }, { data: 'image' }, { data: 'name' }, { data: null } ], dom: 'dom structure', // 替换为你的实际DOM结构,比如'lfrtip' ordering: true, columnDefs: [ { width: '5%', targets: 0 }, { width: '20%', targets: 1 }, { width: '50%', targets: 2 }, { targets: [1, 2], orderable: false }, { responsivePriority: 1, targets: 0 }, { responsivePriority: 2, targets: -1 }, { targets: -1, data: null, render: function(data, type, full) { return `<div> <button class="btn btn-success btn-order" title="Select"> <i class="fa fa-search"></i> </button> </div>`; }, orderable: false, className: 'dtActionCls' } ] }).columns.adjust().responsive.recalc(); return $table; } var $listTable = tableInit(); $("#tableId").on("init.dt", function() { $("#tableId_wrapper .dt-top-row").prepend(` <div class="filter"> <div class="selection"> <select> <option value="" selected>Select</option> <option value="option1">Option 1</option> <option value="option2">Option 2</option> </select> </div> </div> `); });
内容的提问来源于stack exchange,提问作者heero
相关产品推荐
相关产品推荐

