如何在 JQuery 数据表中添加 Rowspan
How to add Rowspan in JQuery datatables
我正在使用 Jquery 数据 table 构建一个 table。
我的要求如下
这不是静态 table,我们使用 json 数据渲染它。
我在这里,使用 "aoColumns" 动态呈现行。
有什么方法可以使用 rowspan 以便可以跨越单元格 (1,2,David,Alex)。
数据table支持这种table吗?
Datatables 不支持这种开箱即用的分组。
但是,在许多情况下,有一个可用的插件。
它称为 RowsGroup,位于此处:Datatables Forums. A live example 也包括在内。
如果您将此示例中的 JS 部分更改为以下内容,您将在输出 window 中向您显示所需的输出。
$(document).ready( function () {
var data = [
['1', 'David', 'Maths', '80'],
['1', 'David', 'Physics', '90'],
['1', 'David', 'Computers', '70'],
['2', 'Alex', 'Maths', '80'],
['2', 'Alex', 'Physics', '70'],
['2', 'Alex', 'Computers', '90'],
];
var table = $('#example').DataTable({
columns: [
{
name: 'first',
title: 'ID',
},
{
name: 'second',
title: 'Name',
},
{
title: 'Subject',
},
{
title: 'Marks',
},
],
data: data,
rowsGroup: [
'first:name',
'second:name'
],
pageLength: '20',
});
} );
这是结果的屏幕截图:
添加以下代码并根据您的要求进行修改
$(window).on("load",function() {
MakeRows();
addRowspan();
$(".paginate_button").on("click", function() {
MakeRows();
addRowspan();
});
});
function MakeRows() {
var tmp_tbl = $("#dashboardDetails");
var _l = tmp_tbl.find("tr");
var _td = "",_t_td = "", old_txt = "",_t_txt = ""; _tr_count = 1;_tr_countadd = 1;
for(i = 0;i< _l.length; i ++) {
_t_td = tmp_tbl.find("tr").eq(i).find("td").eq(0).find("span");
_t_txt = $(_t_td).text();
_t_txt = _t_txt.replace(/\//,"_");_t_txt = _t_txt.replace(/\//,"_");
if (_t_txt.length > 0) {
if(_t_txt != old_txt) {
if($(_l).eq(i).hasClass(_t_txt) == false) {
_tr_count = 1;_tr_countadd = 1;
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i);
}
old_txt = _t_txt;
} else {
_tr_count = _tr_count + 1;
if (_tr_countadd == 1) {
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i)
.addClass("hiddenClass").addClass("maintr").attr("trcount", _tr_count).attr("addedtrcount", "maintr");
_tr_countadd = _tr_countadd + 1;
} else {
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i)
.addClass("hiddenClass").attr("trcount", _tr_count)
}
}
}
_t_td = "";
}
}
function addRowspan() {
var t_txt = "";
var _alltrmain = $(".maintr");
var _h_td = ["0","10","11","12","13"];
for (i = 0; i <= _alltrmain.length; i ++) {
for (j = 0; j <= _h_td.length; j ++) {
t_txt = $(_alltrmain).eq(i).attr("trcount");
$(_alltrmain).eq(i).prev().find("td").eq(_h_td[j]).attr("rowspan", t_txt);
}
}
}
我尝试了 RowsGroup plugin,但它只是通过劫持 DataTables 排序机制来实现这一点。如果您告诉它对给定的列进行分组,它所做的基本上就是对该列应用您无法关闭的排序。所以,如果你想按另一列排序,你不能。这在我的应用程序中不起作用。
相反,这里有一个有效的 fiddle 食谱,可以让您达到这个效果:
https://jsfiddle.net/bwDialogs/fscaos2n
基本思想是将所有多行数据展平为一行。第 2、3 等行中的内容存储为第一行中的隐藏 <script>
模板标签。
它的工作原理是使用 DataTables 的 drawCallback
函数在 DataTables 呈现后操纵 DOM,而不必尝试解析 rowspan
单元格内容而混淆 DataTables。
由于这会在 DataTables 发挥其魔力后修改 DOM,因此即使进行分页、搜索和排序,您的多行部分也会粘在一起。
干杯。
我正在使用 Jquery 数据 table 构建一个 table。
我的要求如下
这不是静态 table,我们使用 json 数据渲染它。
我在这里,使用 "aoColumns" 动态呈现行。
有什么方法可以使用 rowspan 以便可以跨越单元格 (1,2,David,Alex)。
数据table支持这种table吗?
Datatables 不支持这种开箱即用的分组。 但是,在许多情况下,有一个可用的插件。
它称为 RowsGroup,位于此处:Datatables Forums. A live example 也包括在内。
如果您将此示例中的 JS 部分更改为以下内容,您将在输出 window 中向您显示所需的输出。
$(document).ready( function () {
var data = [
['1', 'David', 'Maths', '80'],
['1', 'David', 'Physics', '90'],
['1', 'David', 'Computers', '70'],
['2', 'Alex', 'Maths', '80'],
['2', 'Alex', 'Physics', '70'],
['2', 'Alex', 'Computers', '90'],
];
var table = $('#example').DataTable({
columns: [
{
name: 'first',
title: 'ID',
},
{
name: 'second',
title: 'Name',
},
{
title: 'Subject',
},
{
title: 'Marks',
},
],
data: data,
rowsGroup: [
'first:name',
'second:name'
],
pageLength: '20',
});
} );
这是结果的屏幕截图:
添加以下代码并根据您的要求进行修改
$(window).on("load",function() {
MakeRows();
addRowspan();
$(".paginate_button").on("click", function() {
MakeRows();
addRowspan();
});
});
function MakeRows() {
var tmp_tbl = $("#dashboardDetails");
var _l = tmp_tbl.find("tr");
var _td = "",_t_td = "", old_txt = "",_t_txt = ""; _tr_count = 1;_tr_countadd = 1;
for(i = 0;i< _l.length; i ++) {
_t_td = tmp_tbl.find("tr").eq(i).find("td").eq(0).find("span");
_t_txt = $(_t_td).text();
_t_txt = _t_txt.replace(/\//,"_");_t_txt = _t_txt.replace(/\//,"_");
if (_t_txt.length > 0) {
if(_t_txt != old_txt) {
if($(_l).eq(i).hasClass(_t_txt) == false) {
_tr_count = 1;_tr_countadd = 1;
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i);
}
old_txt = _t_txt;
} else {
_tr_count = _tr_count + 1;
if (_tr_countadd == 1) {
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i)
.addClass("hiddenClass").addClass("maintr").attr("trcount", _tr_count).attr("addedtrcount", "maintr");
_tr_countadd = _tr_countadd + 1;
} else {
$(_l).eq(i).addClass("" + _t_txt + "").addClass(_t_txt + "_" + i)
.addClass("hiddenClass").attr("trcount", _tr_count)
}
}
}
_t_td = "";
}
}
function addRowspan() {
var t_txt = "";
var _alltrmain = $(".maintr");
var _h_td = ["0","10","11","12","13"];
for (i = 0; i <= _alltrmain.length; i ++) {
for (j = 0; j <= _h_td.length; j ++) {
t_txt = $(_alltrmain).eq(i).attr("trcount");
$(_alltrmain).eq(i).prev().find("td").eq(_h_td[j]).attr("rowspan", t_txt);
}
}
}
我尝试了 RowsGroup plugin,但它只是通过劫持 DataTables 排序机制来实现这一点。如果您告诉它对给定的列进行分组,它所做的基本上就是对该列应用您无法关闭的排序。所以,如果你想按另一列排序,你不能。这在我的应用程序中不起作用。
相反,这里有一个有效的 fiddle 食谱,可以让您达到这个效果:
https://jsfiddle.net/bwDialogs/fscaos2n
基本思想是将所有多行数据展平为一行。第 2、3 等行中的内容存储为第一行中的隐藏 <script>
模板标签。
它的工作原理是使用 DataTables 的 drawCallback
函数在 DataTables 呈现后操纵 DOM,而不必尝试解析 rowspan
单元格内容而混淆 DataTables。
由于这会在 DataTables 发挥其魔力后修改 DOM,因此即使进行分页、搜索和排序,您的多行部分也会粘在一起。
干杯。