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

Unexpected result when getting DataTable()

鉴于 tableId 我需要访问 dataTable 实例,然后调用 rows().nodes()。

如果我将 Datatable() 与大 "D" 一起使用,我将获得 DataTable API 实例并可以调用 rows()。但是没想到fnIsDataTable()到return是假的。我猜该函数会询问 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

调用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 创建了一个看起来有点像以下内容的对象:

使用此结构,$(table).get(0) 将使您可以访问整个 <table> DOM 对象,该函数将检查该对象是否是 dataTable 或没有。

新的 API 但是 returns 完全不同的东西,例如:

使用此结构,$(table).get(0) returns undefined 得到 false。

DataTables API 更新似乎没有包含此功能的更新。在解决此问题之前,如果您想继续使用新的 API,请使用 table().node() 函数:

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

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

如果不是 DataTable,以上将抛出错误。如果您不希望它抛出错误而只是想要 truefalse 然后传递 table:

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