【问题标题】:Double ajax call when reloading datatable重新加载数据表时的双重ajax调用
【发布时间】:2026-01-16 10:40:01
【问题描述】:

我有一个这样初始化的数据表:

var _initTable = function() {
    $('#datatablesresults tr').not(':first').on('click', function() {
        var dateandtime = $(this).find(':nth-child(3)').text();
        window.location.href = '/results/detail/dateandtime/' + dateandtime;
    });
};

$('#datatablesresults').dataTable({
    bProcessing  : true,
    sProcessing  : true,
    bServerSide  : true,
    sAjaxSource  : '/results/load-results',
    fnServerParams: function ( aoData ) {
        aoData.push( {"name": "quizid", "value": quizid },{ "name": "questionid", "value": questionid } );
    },
    aoColumnDefs : [{'bSortable' : false, 'aTargets' : ['no-sort']}], // make the actions column unsortable
    sPaginationType : 'full_numbers',
    fnDrawCallback  : function(oSettings) {
        _initTable();
    }
});

当我点击一个按钮时,我想重新加载表格中的数据(进行 ajax 调用)

$('.carousel-control.right').click(function() {
    var currentquestion = $('#myCarousel .active').index('#myCarousel .item') + 1;
    var question = currentquestion + 1;

    var quizid = <?= json_encode($quizid); ?>;

    var activediv = $('.item').filter('.active');
    var questionid = activediv.index() + 2;

    var questionclass = ".question" + questionid;

    var questionid = $(questionclass).attr("id");

    var getParams = "quizid=" + quizid +"&questionid=" + questionid;

    $("#datatablesresults").dataTable().fnReloadAjax("/results/load-results?" + getParams);
});

但数据保持不变......在这里你可以看到我的 ajax 调用:

第一个是我的页面加载时。第二个是我的ajax刷新,重新发送的数据与另一个不同。但是你看到还有另一个覆盖数据的ajax调用......:/

有谁知道我做错了什么?

编辑:我做了一个 jsfiddle:http://jsfiddle.net/8TwS7/

【问题讨论】:

  • 分配给window.location.href 会重新加载页面,是这样吗?
  • 仅当您单击表格中的一行时。而且我 100% 确定页面不会重新加载。

标签: javascript jquery ajax datatables


【解决方案1】:

.dataTable() 一旦你已经定义了它,你就不需要使用它了。

首先将数据表赋值给一个变量:

var myDataTable = $('#datatablesresults').dataTable({
    bProcessing  : true,
    sProcessing  : true,
    bServerSide  : true,
    sAjaxSource  : '/results/load-results',
    fnServerParams: function ( aoData ) {
        aoData.push( {"name": "quizid", "value": quizid },{ "name": "questionid", "value": questionid } );
    },
    aoColumnDefs : [{'bSortable' : false, 'aTargets' : ['no-sort']}], // make the actions column unsortable
    sPaginationType : 'full_numbers',
    fnDrawCallback  : function(oSettings) {
        _initTable();
    }
});

然后在该变量上使用 fnReloadAjax 来刷新它:

myDataTable.fnReloadAjax("/results/load-results?" + getParams);

【讨论】:

  • 你能在你的 jsfiddle 中用一些虚拟数据填充表格吗?很难说这里发生了什么。我会将您的代码修剪为使事情顺利进行所需的最小示例
  • 我遇到了每页加载 2 个 xhr 请求的问题。完全删除了 ServerSide 参数并停止了。似乎分配ajaxSource 绰绰有余。
【解决方案2】:

当您拨打此行时

$("#datatablesresults").dataTable().fnReloadAjax("/results/load-results?" + getParams);

您正在重新初始化数据表

将您的 datatables() 放入准备好的文档中的变量中,然后调用 fnDraw() 以重绘表格...就像我在您的其他问题中回答的那样 Reload datatable data with ajax call on click

如果您需要更多帮助,请发布您的整个 js 代码,我会告诉您

【讨论】:

  • 然后我得到这个错误:未捕获的类型错误:无法读取 null 的属性 'oFeatures'
  • 你必须通过 jsfiddle 发布你的整个源代码才能解决这个问题......有些东西出了问题,如果不查看你所有的源代码,我只会猜测