如何使用 datatable.js 在 tbody 中使用 rowspan 和 colspan?

IT技术 javascript jquery datatables
2021-03-12 09:08:17

每当我使用时<td colspan="x"></td>,都会出现以下错误:

未捕获的类型错误:无法设置 undefined(...) 的属性“_DT_CellIndex”

演示

$("table").DataTable({});
<link href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/css/jquery.dataTables.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/jquery.dataTables.min.js"></script>

<table style="width:50%;">
  <thead>
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>4</th>
      <th>5</th>
      <th>6</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <td>1</td>
      <td colspan="2">3 4</td>
      <td colspan="3">4 5 6</td>
    </tr>
  </tbody>
</table>

它在没有 DataTables.js 的情况下正常工作,但是当我们将这个结构与 datatable.js 一起使用时,它就不起作用了。我们需要上面的表结构。有谁知道我们如何使用这个表结构datatable.js?

6个回答

您可以通过为每个被消除的单元格添加一个“不可见”单元格来解决缺少 colspan 支持的问题:

<tr>
 <td colspan="3">Wide column</td>
 <td style="display: none;"></td>
 <td style="display: none;"></td>
</tr>
<tr>
 <td>Normal column</td>
 <td>Normal column</td>
 <td>Normal column</td>
</tr>

DataTables 没有抱怨,表格呈现正常并且排序工作(不可见列排序为空字符串)。

我还没有用 rowspan 试过这个。

@Protocole 面临同样的排序问题.. 有什么解决办法吗?
2021-04-26 09:08:17
尝试此操作rowspan也有效,但排序可能会破坏布局。
2021-04-29 09:08:17
非常好,谢谢楼主!我在使用引导程序时添加了一个 <td class="d-none"></td>,现在它工作正常。
2021-05-01 09:08:17
抱歉,@BharatGeleda,我只是不需要它并禁用了它。
2021-05-08 09:08:17
请注意,如果您已scrollX启用,则单元格与此解决方案确实不对齐:jsfiddle.net/3aprx7wk/4
2021-05-16 09:08:17

COLSPAN:Ajax 或 JavaScript 源数据

Dirk Bergstrom提供的优秀解决方案仅适用于 HTML 源数据。

也可以对 Ajax 源数据使用相同的想法。

在表格正文中创建元素时,您需要使用createdRow选项来修改所需的单元格TR

例如:

var table = $('#example').DataTable({
    ajax: 'https://api.myjson.com/bins/qgcu',
    createdRow: function(row, data, dataIndex){
        // If name is "Ashton Cox"
        if(data[0] === 'Ashton Cox'){
            // Add COLSPAN attribute
            $('td:eq(1)', row).attr('colspan', 3);

            // Hide required number of columns
            // next to the cell with COLSPAN attribute
            $('td:eq(2)', row).css('display', 'none');
            $('td:eq(3)', row).css('display', 'none');

            // Update cell data
            this.api().cell($('td:eq(1)', row)).data('N/A');
        }
    }
});

有关代码和演示,请参阅此示例

有关更多详细信息,请参阅jQuery DataTables: COLSPAN in table body TBODY - Ajax 数据文章。

行跨度

可以ROWSPAN使用RowsGroup插件模拟属性

要使用该插件,您需要包含 JavaScript 文件dataTables.rowsGroup.js并使用rowsGroup选项来指示要应用分组的列的索引。

var table = $('#example').DataTable({
   'rowsGroup': [2]
});

有关代码和演示,请参阅此示例

有关更多详细信息,请参阅表格正文 TBODY文章中的jQuery DataTables:ROWSPAN

COLSPAN 和 ROWSPAN

如果我们结合上述两种解决方法,就可以同时垂直和水平地对单元格进行分组。

有关代码和演示,请参阅此示例

有关更多详细信息,请参阅jQuery DataTables: COLSPAN in table body TBODY - COLSPAN 和 ROWSPAN文章。

如果您正在使用 scrollX

<thead>
<tr>
 <th style="width: 20px;"></th>
 <th>column H</td>
 <th>column H</td>
</tr>
</thead>
<tbody>
<tr>
 <td colspan="3">Wide column</td>
 <td style="display: none;"></td>
 <td style="display: none;"></td>
</tr>
<tr>
 <td>123</td>
 <td>Normal column</td>
 <td>Normal column</td>
</tr>
</tbody>

#Dirk_Bergstrom 的修改答案

简单的解决方案在这里。

<tr>
    <td colspan="4">details</td>
    <td style="display: none"></td>
    <td style="display: none"></td>
    <td style="display: none"></td>
</tr>

没有其他解决方案 https://datatables.net/forums/discussion/33497/cannot-set-property-dt-cellindex-of-undefined

请参考以下链接。

fnFakeRowspan

另请参阅此处的插件。

fnFakeRowspan 插件

希望能帮到你