获取 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());
其中 yourTableVariableName
是 dataTableBigD
或您选择的任何其他内容。
如果不是 DataTable
,以上将抛出错误。如果您不希望它抛出错误而只是想要 true
或 false
然后传递 table:
的 id
$.fn.dataTable.fnIsDataTable("#example");
鉴于 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());
其中 yourTableVariableName
是 dataTableBigD
或您选择的任何其他内容。
如果不是 DataTable
,以上将抛出错误。如果您不希望它抛出错误而只是想要 true
或 false
然后传递 table:
id
$.fn.dataTable.fnIsDataTable("#example");