未捕获的类型错误:无法读取未定义的属性“mData”

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“mData”【英文标题】:Uncaught TypeError: Cannot read property 'mData' of undefined 【发布时间】:2015-08-02 18:11:57 【问题描述】:

我关注了this 用于使用 DataTables 插件启用多个表(在同一页面上)。 对于手动表,它可以工作,但对于动态创建的表,它会显示以下错误:

我的页面脚本:

 $(document).ready(function() 
         $('table.datatable').dataTable( 
            'bSort': false,
            'aoColumns': [
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "10%", bSearchable: false, bSortable: false 
            ],
            "scrollY":        "200px",
            "scrollCollapse": false,
            "info":           true,
            "paging":         true
         );
     );

我的 html 第一个表格:

<table class="table table-striped table-bordered datatable">
    <thead>
        <tr>
            <th>  Issue      </th>
            <th>  Product      </th>
            <th>  Qty      </th>
            <th class="text-right"> Paid    </th>
            <th class="text-right"> Balance    </th>
            <th class="text-right"> Total    </th>
        </tr>   
    </thead><!-- table head -->
    <tbody>
        <tr>
            <td>May 20, 2015</a></td>
            <td>Normal Sim</td>
            <td>1000</td>
            <td><span class="pull-right">Rs18,893.00 </span></td>
            <td><span class="pull-right">Rs131,107.00 </span></td>
            <td><span class="pull-right">Rs150,000.00 </span></td>
        </tr>
        <tr>
            <td>voice/7?invoice_type=1">May 20, 2015</a></td>
            <td>Nokia 3310 </td>
            <td>10000</td>
            <td><span class="pull-right">Rs2,520,000.00 </span></td>
            <td><span class="pull-right">Rs12,480,000.00 </span></td>
            <td><span class="pull-right">Rs15,000,000.00 </span></td>
        </tr>
        <tr>
            <td>May 20, 2015</a></td>
            <td>Nokia 3310 </td>
            <td>1000</td>
            <td><span class="pull-right">Rs404,000.00 </span></td>
            <td><span class="pull-right">Rs1,096,000.00 </span></td>
            <td><span class="pull-right">Rs1,500,000.00 </span></td>
        </tr>
    </tbody>
</table>

第二张桌子:

<table class="table table-striped table-bordered datatable" id="p_history">
    <thead>
        <tr>
            <th>Issue</th>
            <th>Paid</th>
            <th>Comments</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 15,000.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 12.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 123.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 123.00 </td>
            <td></td>
        </tr>
    </tbody>
</table>

知道如何解决吗?

注意:我还阅读了this未回答的问题,同样的错误,但我的标准不同,因此它不是重复的。

【问题讨论】:

显示您的 html 代码以便更好地理解 根据usage guide,您的表中需要有theadtbody。你缺少其中任何一个吗? 我更新了问题 因为我已经有这方面的经验,你应该检查以下内容:- 如果你有 tbody 和 thead 标签 - 如果你有相同数量的行和列(th 和 tb 必须有相同的数量) 【参考方案1】:

原因

您正在尝试使用相同的选项初始化多个表,最重要的是aoColumns,数组包含列定义。您的 aoColumns 数组仅包含 3 个项目,但是每个表中的列数不同,这就是您收到错误的原因。

来自manual:

aoColumns: 如果指定,那么这个数组的长度必须相等 到原始 HTML 表中的列数。在哪里使用'null' 您希望仅使用默认值并自动检测到 选项。

解决方案

您需要为第一个表分配唯一的id,并分别初始化每个表,如下所示。

$(document).ready(function() 
   $('#table_first').dataTable( 
       'bSort': false,
       'aoColumns': [
              sWidth: "15%", bSearchable: false, bSortable: false ,
              sWidth: "15%", bSearchable: false, bSortable: false ,
              sWidth: "15%", bSearchable: false, bSortable: false ,
              sWidth: "15%", bSearchable: false, bSortable: false ,
              sWidth: "15%", bSearchable: false, bSortable: false ,
              sWidth: "15%", bSearchable: false, bSortable: false ,
       ],
       "scrollY":        "200px",
       "scrollCollapse": false,
       "info":           true,
       "paging":         true
   );

    $('#p_history').dataTable( 
       'bSort': false,
       'aoColumns': [
              sWidth: "45%", bSearchable: false, bSortable: false ,
              sWidth: "45%", bSearchable: false, bSortable: false ,
              sWidth: "10%", bSearchable: false, bSortable: false 
       ],
       "scrollY":        "200px",
       "scrollCollapse": false,
       "info":           true,
       "paging":         true
    );

 );
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
<link href="//cdn.datatables.net/1.10.7/css/jquery.dataTables.css" rel="stylesheet"/>
<script src="//cdn.datatables.net/1.10.7/js/jquery.dataTables.js"></script>

<table class="table table-striped table-bordered datatable" id="table_first">
    <thead>
        <tr>
            <th>  Issue      </th>
            <th>  Product      </th>
            <th>  Qty      </th>
            <th class="text-right"> Paid    </th>
            <th class="text-right"> Balance    </th>
            <th class="text-right"> Total    </th>
        </tr>   
    </thead><!-- table head -->
    <tbody>
        <tr>
            <td>May 20, 2015</a></td>
            <td>Normal Sim</td>
            <td>1000</td>
            <td><span class="pull-right">Rs18,893.00 </span></td>
            <td><span class="pull-right">Rs131,107.00 </span></td>
            <td><span class="pull-right">Rs150,000.00 </span></td>
        </tr>
        <tr>
            <td>voice/7?invoice_type=1">May 20, 2015</a></td>
            <td>Nokia 3310 </td>
            <td>10000</td>
            <td><span class="pull-right">Rs2,520,000.00 </span></td>
            <td><span class="pull-right">Rs12,480,000.00 </span></td>
            <td><span class="pull-right">Rs15,000,000.00 </span></td>
        </tr>
        <tr>
            <td>May 20, 2015</a></td>
            <td>Nokia 3310 </td>
            <td>1000</td>
            <td><span class="pull-right">Rs404,000.00 </span></td>
            <td><span class="pull-right">Rs1,096,000.00 </span></td>
            <td><span class="pull-right">Rs1,500,000.00 </span></td>
        </tr>
    </tbody>
</table>

<table class="table table-striped table-bordered datatable" id="p_history">
    <thead>
        <tr>
            <th>Issue</th>
            <th>Paid</th>
            <th>Comments</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 15,000.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 12.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 123.00 </td>
            <td></td>
        </tr>
        <tr>
            <td>May 20, 2015, 5:15 pm</td>
            <td>Rs 123.00 </td>
            <td></td>
        </tr>
    </tbody>
</table>

链接

有关此错误和其他常见控制台错误的更多信息,请参阅 jQuery DataTables: Common javascript console errors。

【讨论】:

【参考方案2】:

如 DataTables usage guide 中所述,您需要在表中同时声明 theadtbody 部分才能使插件正常工作。

这件事之前也讨论过here at SO,所以下次谷歌搜索或SO搜索可能是件好事。

【讨论】:

有趣的是,我用谷歌搜索了好几次,都没有找到问题所在。幸运的是,我阅读了您针对其他解决方案的答案,并且我得到了解决。谢谢。 我用谷歌搜索并被直接带到了这个问题,所以这是一个很好的问题 @RodneyEllis 我从来没有说过这个问题不好。我只是说之前在这里讨论过。【参考方案3】:

如果您的 aaData 是数组数组,例如 [["col11","col12","col13"],["col21","col22","col23"]], 那么只有上面的代码才能工作,否则它会期望将 mdata 属性设置为 col 值,例如 aaData=[col1:"col1val",col2:"col2val",col3:"col3val"],

映射 aoColumns- 所以在 aoColumns :[mdata:"col1"]


这样做 -

$(document).ready(function() 
         $('#p_history').dataTable( 
            'bSort': false,
            'aoColumns': [
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "10%", bSearchable: false, bSortable: false ,
                  //match the number of columns here for table1
            ],
            "scrollY":        "200px",
            "scrollCollapse": false,
            "info":           true,
            "paging":         true
         );


//Now for another table
         $('#secondTableId').dataTable( 
            'bSort': false,
            'aoColumns': [
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "45%", bSearchable: false, bSortable: false ,
                   sWidth: "10%", bSearchable: false, bSortable: false ,
                  //match the number of columns here for table2
            ],
            "scrollY":        "200px",
            "scrollCollapse": false,
            "info":           true,
            "paging":         true
         );
     );

【讨论】:

你在使用服务器端分页吗? 我认为您遇到了问题,因为您正在创建两个具有相同类名的数据表。尝试为每个表提供不同的 id,然后在您的文档中准备好实例化数据表,例如 $('#id1').dataTable(..your code), $('#id2').dataTable(..your code ) 只需在准备好的文档中尝试此操作即可 $("#p_history").datatable(); 我检查过它工作正常,但有两个表不工作【参考方案4】:

我在使用 id 名称(如 k_something_1)时收到此错误。 我通过将其“重命名”为 ksomething1 来解决它。

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性“mData”的主要内容,如果未能解决你的问题,请参考以下文章

数据表插件错误未捕获的类型错误:无法读取未定义的属性“mData”

jQuery DataTables:未捕获的 TypeError:无法读取未定义的属性“mData”

错误类型错误:无法读取未定义 Angular 6 的属性“mData”

未捕获的类型错误:无法读取未定义的属性“区域”?

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`

未捕获的类型错误:无法读取未定义的属性 toLowerCase