2016-07-29 55 views
0

我正在使用混合使用jQuery DataTables插件的旧版代码(版本1.10。一些旧代码绕过jQuery对象,并且一些旧代码通过DataTables API objects传递。我想让所有新的代码接受一个jQuery对象或一个DataTables API对象,但是我一直未能检测到一个变量引用了一个DataTables API对象。测试jQuery-DataTables API对象

我能找到的唯一检测方法在API中,isDataTable不适用 - 它为表格选择一个字符串并返回该选择是否已转换为数据表格。

中的“类别检测”方法不工作; typeof返回"object",constructor.name返回"Object",我不知道用于instanceofisPrototypeOf的构造函数。

正如this answer建议(以同样的问题),Object.prototype.toString.call(var)返回"[object Object]"

在Chrome中,console.log(var)产生看起来有一些其他类的信息摘要:

▶ _Api {context: Array[1], selector: Object, ajax: Object} 

我想,意味着有是我可以使用的地方,但this question关于Chrome的名称没有有用的答案。

如何检测变量引用jQuery-DataTables API对象的时间?

回答

1

您可以在Chrome中使用断点来挖掘更多内容。如果你在一个DataTable变量之后设置一个断点,然后评估这个变量,你会得到一个完整的地图。我做到了,发现这个:

var myDataTable = $('#myTable').DataTable(myOptions); 
alert(myDataTable.$.__dt_wrapper); 

该警报返回true。 (myOptions是包含DataTable的所有选项的对象。)所以,我查看了一个对象(我使用了myOptions)来查看我可以测试的内容。您无法直接测试myOptions.$.__dt_wrapper)是否为假,因为myOptions.$的计算结果为undefined。所以:

if(undefined != myObjectVariable.$ && myObjectVariable.$.__dt_wrapper) { 
    alert('A DataTable Object') 
} else { 
    alert('Not a DataTable Object') 
} 

谷歌搜索“__dt_wrapper”不显示无关的数据表的任何链接。看看datatables.js,它会发生两次。这两种情况都表明它是用于表示DataTable对象的内部属性,或者更具体地说是一个对象是否是DataTable包装器。

由于这是无证的,所以不能保证它可以在所有未来版本的DataTable中工作。但是这在DataTables 1.10.11中有效。

编辑:我问了一下这对数据表论坛(link),并有确实是一个更清洁的方式来做到这一点:

myObjectVariable instanceof $.fn.DataTable.Api 

如果对象是一个DataTable是真实的。 (这也适用于小写dataTable对象。)

+0

“!+”是语法错误,我假设这是“!=”的错字 – ShadSterling

+0

原来我使用的是DataTable 1.10.3,解决方案工作谢谢! – ShadSterling

+0

不客气。很高兴听到它,但我会在DataTables论坛上发布这个问题,看看艾伦贾丁是否有更好的方法来处理它。我担心这可能会突破某处。是的,这是一个语法错误,我的错误。我会解决它,谢谢。愚蠢的换档键。 – BobRodes