JSP页面DataTable每页长度修改失败求助
解决DataTable特定页面修改分页长度无效的问题
我来帮你排查下这个问题——你遇到的是在DataTable绘制到第2页时,尝试修改每页显示条数但始终不生效的情况,咱们先拆解代码里的几个关键问题,再给出可行的解决方案:
先看你代码里的核心问题
- 变量名不匹配:在
draw.dt事件中你用了table.page.info(),但初始化DataTable时保存的变量是dTable,这会导致无法正确获取分页信息,是功能失效的核心原因之一。 - 非标准API调用:方法2里的
getPager()不是DataTables的官方API,这个方法不存在,自然不会生效。 - 重复初始化冲突:方法3重新调用
$('#result').DataTable({ pageLength: 80 })会和已有的表格实例冲突,表格初始化后不能再用这种方式修改配置。
修正后的完整代码
下面是调整后的代码,我标注了关键修改点:
$(document).ready(function() { document.getElementById("invoiceResult").style.display="block"; // 保存DataTable实例到dTable变量,后续操作统一用这个变量 dTable = $('#result').DataTable({ paging: true, "lengthChange": true, fixedHeader: true, "scrollY": 400, "scrollX": true, "bJQueryUI": true, fixedColumns: true, "pageLength": 25, "order": [[4, "desc"]], "columnDefs": [{ "width": "100px", "targets": 0 }], drawCallback: function() { $('#result').margetable({ type: 2, colindex: [0,1], }); }, rowsGroup: [0,1] }); // 监听draw事件,直接用已保存的dTable实例绑定 dTable.on('draw.dt', function() { var info = dTable.page.info(); var currentPage = info.page + 1; // 添加标记避免无限触发draw事件(因为draw()会再次触发该事件) if(currentPage === 2 && !$(this).data('hasChangedLength')){ // 使用官方API设置每页长度,draw('page')保持当前页码不变 dTable.page.len(80).draw('page'); // 标记已修改,防止重复执行 $(this).data('hasChangedLength', true); } // 回到非第2页时重置标记,方便再次切换到第2页时生效 if(currentPage !== 2){ $(this).data('hasChangedLength', false); } }); });
关键修改说明
- 统一实例变量:所有操作都使用初始化时保存的
dTable,避免重复调用$('#result').DataTable()导致的实例混乱。 - 避免无限循环:通过
hasChangedLength标记控制逻辑,防止调用draw()后反复触发事件。 - 使用官方标准API:
page.len()是DataTables官方提供的设置每页条数的方法,draw('page')参数可以保持当前页码,不会跳回第1页。 - 移除无效操作:删掉了非标准的
getPager()和重复初始化的代码,这些都是错误用法。
另外你设置的lengthChange: true是正常生效的,上面的代码不会影响用户手动切换分页长度的功能,只是在自动切换到第2页时修改每页显示条数。
内容的提问来源于stack exchange,提问作者Anurag1804
相关产品推荐
相关产品推荐

