2016-09-21 41 views
0

我有以下代码。我想知道为什么它以一种方式工作,而不是另一种。奇怪的jQuery数据表初始化行为

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"/> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
<meta name="viewport" content="width=device-width, initial-scale=1"/> 
<title>Chart</title> 
<link href="./css/jquery.dataTables.min.css" rel="stylesheet"/> 
<script src="./js/jquery-3.1.0.min.js"></script> 
<script src="./js/jquery.dataTables.min.js"></script> 
<script> 
/* 
// THIS BLOCK DOES NOT WORK 
var tbldata; 

$(document).ready 
(
     function() 
     { 
       tbldata = $("#tbldata").DataTable(); 
     } 
); 
*/ 

// THIS SINGLE LINE WORKS 
var tbldata = $("#tbldata").DataTable(); 
</script> 
</head> 
<body> 
     <div> 
       <table id="tbldata"> 
         <thead></thead> 
         <tbody></tbody> 
       </table> 
     </div> 
</body> 
</html> 

它给了我下面的错误,如果我取消这标志着我不工作,并排除工作单线上的块。

jQuery.Deferred exception: Cannot read property 'aDataSort' of undefined TypeError: Cannot read property 'aDataSort' of undefined 
    at V (http://192.168.33.10:5000/static/js/jquery.dataTables.min.js:65:443) 
    at va (http://192.168.33.10:5000/static/js/jquery.dataTables.min.js:70:61) 
    at HTMLTableElement.<anonymous> (http://192.168.33.10:5000/static/js/jquery.dataTables.min.js:91:148) 
    at Function.each (http://192.168.33.10:5000/static/js/jquery-3.1.0.min.js:2:2815) 
    at r.each (http://192.168.33.10:5000/static/js/jquery-3.1.0.min.js:2:1003) 
    at r.m [as dataTable] (http://192.168.33.10:5000/static/js/jquery.dataTables.min.js:82:388) 
    at r.h.fn.DataTable (http://192.168.33.10:5000/static/js/jquery.dataTables.min.js:166:245) 
    at HTMLDocument.<anonymous> (http://192.168.33.10:5000/static/test.html:30:45) 
    at j (http://192.168.33.10:5000/static/js/jquery-3.1.0.min.js:2:29568) 
    at k (http://192.168.33.10:5000/static/js/jquery-3.1.0.min.js:2:29882) undefined 
+0

据我所知,您所评论的区块必须正常工作,且单行不得起作用。如果它的其他方式是**奇怪** –

回答

4

当调用初始化数据表不带任何选项,它需要一个人口稠密thead因此它可以尝试检测列及其属性。

将至少一个<th>元素添加到您的thead,然后评论的代码将工作。

未注释的行不是真的正在工作。在JavaScript运行的时候,页面上还没有该元素!所以选择器抓取0个元素,初始化器没有真正运行,因此没有错误。

或者(我大多数情况下初始化DT的首选方法)...给你的初始化器一个列定义的数组。

$('#mytable').DataTable({ 
    columns: [{ title: 'First Name', data: 'FirstName' }] //etc, etc... 
}) 
+0

可能你是对的...让我们等待OP –

+0

提前面对这个问题。是的,你是对的,没有任何列初始化表不应该工作...但问题仍然是相同的,为什么单行工作!为什么没有那么突破。 –

+1

我在我的答案的最后一段解释了这一点。它/不是/真正的工作,它只是没有抛出一个错误。 JS在元素存在之前运行。选择器选取零个元素,所以DataTable初始化器不运行。 Ergo,没有错误。 – BLSully