Javascript 无法重新初始化JQuery数据表

Javascript 无法重新初始化JQuery数据表,javascript,jquery,json,jquery-datatables,Javascript,Jquery,Json,Jquery Datatables,我使用jquerydatatables显示网格内的数据。在初始化页面加载时,脚本使用DateTime。今天,进一步处理它们,问题是在初始化页面加载之后,当我尝试使用用户输入日期进行进一步处理时。我有以下错误 DataTables警告(表id='dataTable'):无法重新初始化dataTable。 要检索此表的DataTables对象,请不要传递任何参数或查看Bretrive和bDestroy的文档 function getDate() { var date = $('input[n

我使用jquerydatatables显示网格内的数据。在初始化页面加载时,脚本使用DateTime。今天,进一步处理它们,问题是在初始化页面加载之后,当我尝试使用用户输入日期进行进一步处理时。我有以下错误

DataTables警告(表id='dataTable'):无法重新初始化dataTable。 要检索此表的DataTables对象,请不要传递任何参数或查看Bretrive和bDestroy的文档

function getDate() {
    var date = $('input[name="myDate"]').val();
    return date;
}

$('#myDate').click(updateDate);

function updateDate() { 
    $('#dataTable').dataTable({
        "bServerSide": true,
        "sAjaxSource": "/Home/Ajax",
        "fnServerParams": function (aoData) {
            var date = getDate();
            aoData.push({ "name": "myDate", "value": date });
        },
        //... there's more
}

updateDate();
脚本放在页面底部。

尝试将“bDestroy”:true添加到选项对象文本中,例如

$('#dataTable').dataTable({
    "bServerSide": true,
    ....
    "bDestroy": true
});

检查代码中是否存在对datatable的重复调用。如果不小心多次初始化表,它会返回此错误,我知道这是一个老问题。但这是为其他有类似问题的人准备的

您应该销毁旧的数据表分配。 在创建新的datatable之前,请使用以下代码

$("#dataTable").dataTable().fnDestroy();

您要做的第一件事是清理和销毁数据表

var tables = $.fn.dataTable.fnTables(true);

$(tables).each(function () {
  $(this).dataTable().fnClearTable();
  $(this).dataTable().fnDestroy();
});
然后重新创建

$("#datagrid").dataTable();

DataTables API已更改,但如果再次尝试重新初始化datatable,仍会引发此错误

您可以检查它是否已使用以下工具创建:

$.fn.DataTable.isDataTable("#myTable")
并将其销毁以便重新创建:

$('#myTable').DataTable().clear().destroy();

这不是最有效的方法,但它是有效的。应该可以在不首先破坏表的情况下更新表,只需使用
清除
行.add
,但当数据源是传递给构造函数的数组时,我还没有找到这样做的方法

新的Datatables API有一个重新加载函数,它将再次从ajax源获取数据,而无需先销毁表。当我有一个包含大量行(5000+行)的表时,销毁要比初始加载花费更长的时间,加上销毁时“处理”框不会显示,但重新加载速度非常快,在工作时正确显示“处理”框

下面是问题中代码的更新版本,它使用新的API来实现所需的效果:

function getDate() {
  var date = $('input[name="myDate"]').val();
  return date;
}

$('#myDate').click(updateDate);

// Use .DataTable instead of .dataTable
// It returns a different object that has the ajax attribute on it.
var myDataTable = $('#dataTable').DataTable({
  "bServerSide": true,
  "sAjaxSource": "/Home/Ajax",
  "fnServerParams": function (aoData) {
    var date = getDate();
    aoData.push({ "name": "myDate", "value": date });
  },
  //... there's more

function updateDate() { 
  myDataTable.ajax.reload();
}

我所做的唯一更改是使用
.DataTable
而不是
.DataTable
,并维护对返回值
myDataTable
的引用,以便可以使用它调用
.ajax.reload()
清除现有的数据表:

$(this).dataTable().fnClearTable();
$(this).dataTable().fnDestroy();
这绝对是我想要的。重新初始化datat表的很好的解决方案

这对我很有用 变量表=$('#表1')。数据表({ 摧毁:没错, 回答:是的, .....
});

谢谢,但添加了“bDestroy”:真正的错误信息消失了,但我没有得到日期值,因此错误也随着日期值消失了。因此,问题仍然存在。仅使用bdestory:true对我来说效果很好。新数据将添加到旧数据中,然后您将获得两个数据的表感谢您的解决方案仅使用bdestory:true对我来说效果很好在较新版本的数据表中,
bdestory
选项已重命名为
destroy
(),但是
bDestroy
仍能正常工作。您能具体说明一下吗?当dataTable未初始化时,它对我不起作用,我们试图销毁它。为了解决这个问题,我把它包装在try-catch块中我的表内容在销毁后一直在增加,所以不知何故,数据一直在增加。我们现在到处都可以使用大写的
D
字母坐在
DataTable
上吗?有了新的API,这应该会被选为可接受的顶部answer@andi--大写字母“D”是一个错误:大写字母D认为这是一个错误,但事实并非如此:
var myDataTable = $('#dataTable').DataTable();
myDataTable.ajax.reload();