根据项目需要,前端需要实现根据用户选择的因子来生成动态多行表头,经测试发现,多行表头其实就是由多维数组实现,只要将自己的数据按照bootstrapTable数据格式拼接成所对应的数组就可以实现功能,本文为实现代码供大家参考:
【注】前端html页面需要引入对应的库,
如:bootstrap-table.js、bootstrap-table-zh-CN.js、bootstrap-table.css、jquery-2.2.3.min.js;
下载网址:(bootstrap Table)https://bootstrap-table.com/,
(jQuery) https://jquery.com/
一、html
<body>
<div class="content col-xs-12">
<ul class="itemArea">
<li role="menuitem" class="checkItem">
<label><input type="checkbox" checked="" data-code="B01"> 因子一 </label>
</li>
<li role="menuitem" class="checkItem">
<label><input type="checkbox" checked="" data-code="B02"> 因子二 </label>
</li>
<li role="menuitem" class="checkItem">
<label><input type="checkbox" checked="" data-code="B03"> 因子三 </label>
</li>
</ul>
<table class="table table-striped" id="table">
<!--表格内容-->
</table>
</div>
</body>
二、Js
<script type="text/javascript">
$(function () {
getItemData(); // 获取动态因子数据
// 监听因子点击事件
$(".itemArea li label").click(function () {
getItemData();
});
});
function getItemData() {
var itemCode=[], //所选择因子的code
itemName=[]; // 所选择因子的text
$.each($(".itemArea li input[type='checkbox']"),function () {
if($(this).is(":checked")){
itemCode.push($(this).data("code"));
itemName.push($(this).parents("label").text());
}
});
buildTable(itemName,itemCode); //根据因子选择状态创建表格
}
function buildTable(itemName,itemCode) {
//模拟数据
var mockData = [
{
"province": "浙江省",
"city": "杭州市",
"cityLevel": "二线",
"item0B01": "1",
"item0B02": "1",
"item0B03": "1",
"item1B01": "1",
"item1B02": "1",
"item1B03": "1",
"item2B01": "1",
"item2B02": "1",
"item2B03": "1"
},
{
"province": "福建省",
"city": "福州市",
"cityLevel": "二线",
"item0B01": "4",
"item0B02": "4",
"item0B03": "4",
"item1B01": "54",
"item1B02": "54",
"item1B03": "54",
"item2B01": "7",
"item2B02": "7",
"item2B03": "7"
},
{
"province": "湖南省",
"city": "长沙市",
"cityLevel": "三线",
"item0B01": "18",
"item0B02": "22",
"item0B03": "31",
"item1B01": "45",
"item1B02": "74",
"item1B03": "20",
"item2B01": "44",
"item2B02": "16",
"item2B03": "48"
}
];
var columns = [],
initColumns = [],//公共固定列
itemColumns = []; //动态因子列
initColumns = [
{
field: 'Number',
title: '',
width: 35,
formatter: function (value, row, index) {//自动排序
return index + 1;
},
rowspan: 2 //合并两行
}, {
field: 'province',
title: '省份',
width: 80,
align: "center",
halign: "center",
valign: "middle",
rowspan: 2
}, {
field: 'city',
title: '省会',
align: "center",
halign: "center",
valign: "middle",
width: 90,
rowspan: 2
}, {
field: 'cityLevel',
title: '城市级别',
width: 80,
align: "center",
halign: "center",
valign: "middle",
rowspan: 2
}
];
if(itemCode.length>0){
//根据选择因子绘制动态表头
for (var i = 0; i < itemCode.length; i++) {
initColumns.push (
{
field: "",
title: itemName[i] ,
width: 80,
align: "right",
halign: "center",
colspan: 3
}
);
itemColumns.push(
{
field: 'item' + i + itemCode[i],
title: 'item' + itemCode[i],
width: 80,
align: 'center',
halign: 'center'
},
{
field: 'item' + i + itemCode[i],
title: 'item' + itemCode[i],
width: 80,
align: 'center',
halign: 'center'
},{
field: 'item' + i + itemCode[i],
title: 'item' + itemCode[i],
width: 80,
align: 'center',
halign: 'center'
}
);
}
}
columns.push(initColumns, itemColumns); //合并表格内容
$('#table').bootstrapTable('destroy').bootstrapTable({
data: mockData, //添加模拟数据
pagination: true,//分页
minimumCountColumns: 4,//设置最小列数
paginationLoop: true,
striped: true,//是否显示行间隔色
paginationPreText: "上一页",
paginationNextText: "下一页",
undefinedText: " ",
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 15,
pageList: [10, 15, 20, 25, 30],
columns: columns //动态拼接生成表格
});
}
</script>
三、效果图