获取DataTable()时出现意外结果

时间:2015-03-26 09:35:07

标签: javascript jquery jquery-datatables

给定tableId我需要访问dataTable实例,然后调用rows()。nodes()。

如果我使用Datatable()与大" D"我获得DataTable API实例并可以调用rows()。但我并不期望fnIsDataTable()返回false。我想这个函数询问dataTable是否是一个jQuery对象。真的吗?那么有这样的功能吗? fnIsDataTableApiInstance...()

点击了行:

var dataTableBigD = $('#' + tableId).DataTable(); // big "D"
console.log('$.fn.dataTable.fnIsDataTable(dataTableBigD): ' + $.fn.dataTable.fnIsDataTable(dataTableBigD)); // false
console.log('nodesBigD: ' + dataTableBigD.rows('.selected').nodes().length);

var dataTableLowD = $('#' + tableId).dataTable(); // low "d"
console.log('$.fn.dataTable.fnIsDataTable(dataTableLowD): ' + $.fn.dataTable.fnIsDataTable(dataTableLowD)); // true
console.log('nodesLowD: ' + dataTableLowD.rows('.selected').nodes().length); // TypeError: t.rows is not a function

输出:

$.fn.dataTable.fnIsDataTable(dataTableBigD): false
nodesBigD: 1
$.fn.dataTable.fnIsDataTable(dataTableLowD): true
// TypeError: t.rows is not a function

$.fn.dataTable.fnIsDataTable(dataTableBigD): false
nodesBigD: 2
$.fn.dataTable.fnIsDataTable(dataTableLowD): true
// TypeError: t.rows is not a function

1 个答案:

答案 0 :(得分:1)

当您调用fnIsDataTable()时,其1.10的更新版本称为isDataTable(),将调用以下函数:

DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
{
    var t = $(table).get(0);

    var is = false;

    $.each( DataTable.settings, function (i, o) {
        if ( o.nTable === t || o.nScrollHead === t || o.nScrollFoot === t ) {
            is = true;
        }
    } );

    return is;
};

您可以在jquery.dataTables.js的第8823行看到此功能。

使用dataTable()进行初始化时此函数的工作原理是因为旧API创建的对象看起来有点像以下内容:

enter image description here

使用此结构,$(table).get(0)将允许您访问函数将检查的整个<table> DOM对象,以查看它是否为dataTable

然而,新API会返回完全不同的内容,例如:

enter image description here

使用此结构时,$(table).get(0)会返回undefined并且您会收到错误。

似乎DataTables API更新未包含此功能的更新。在修复此问题之前,如果您想继续使用新API,则使用table().node()函数:

$.fn.dataTable.fnIsDataTable(yourTableVariableName.table().node());

yourTableVariableNamedataTableBigD或您选择的其他任何内容。

如果它不是DataTable,则会抛出错误。如果您不希望它抛出错误而只是想要truefalse,那么请传递表格的id

$.fn.dataTable.fnIsDataTable("#example");