【项目背景】
多个页面具有层级关系,从某个页面的链接点击到下一级别的页面,各个页面的表头不一致,同时要求添加统计信息。
例如有以下三个页面:
#-1-> 学校名称 学生人数
#-2-> 学校名称 年级 学生人数
#-3-> 学校名称 年级 班级 学生人数
【解决思路】
每次ajax刷新去后台取数据后通过绘制把数据显示到DataTable中,每次绘制之前把原先的表格删掉,然后重写表格表头和统计footer。
【参考代码】
table表设定的id为:StuQueryTable
<table class="cell-border compact stripe" style='width:100%'id="StuQueryTable"></table>设置一个函数 getTableData() 用于ajax去后台取数据
成功获取得到的数据dataArray有两部分
dataArray.BodyData -> 表格的主体数据
dataArray.TotalData -> 表格的统计数据
function getTableData() { $.ajax({ data:{}, //要传给后台的数据 type:"post", //以POST的方式传输 url:"QueryServlet", // async: true, //默认(true)ajax是异步执行,这里设置成同步,不然会导致ajax没有执行完就执行下面的代码了 dataType:"json", //返回数据格式为JSON beforeSend: function (){ //写传输之前要做的事情 }, success: function (dataArray) { console.log(dataArray); //绘制表格 drawTable(dataArray); }, error: function (e) { alert("错误! " + e.status); }, complete: function () { //写完成传输后要做的事情 } }); }当数据成功从后台Servlet返回后去drawTable
首先设定了一个变量curPageRank用于判断当前是哪一级页面
#-1-> 学校名称 学生人数 --> curPageRank = 1
#-2-> 学校名称 年级 学生人数 --> curPageRank = 2
#-3-> 学校名称 年级 班级 学生人数 --> curPageRank = 3
然后设定三个变量分别对应需要改变的东西
//设定不同的表格,因为footer需要对应固定数目的<th> var tableFrame; //设定不同的表格列渲染 var columns; //设定不同的footcallback函数,渲染相应的footer var footCallBack;ex. curPageRank==1
#------tableFrame--------
需要注意的是如果使用footer需要添加对应的<th>才能正常显示
例如第一级的表有两个字段分别是学校名称、学生人数,就需要添加两个<th>
<table class="cell-border compact stripe" style='width:100%'id="StuQueryTable"> <tfoot> <tr> <th></th> <th></th> </tr> </tfoot> </table>#------columns--------
写具体的渲染列数据,data对应JSON中的key值,title则是表头要显示的字符串
columns = [ {"data": "学校名称",title:"学校名称"}, {"data": "学生人数",title:"学生人数"} ];#------footCallBack--------
首先取到后台的统计数据保存到totalJsonObj中,然后找到表格tfoot的th,一个一个通过$th.eq(index)进行赋值。
footCallBack = function (tfoot, data, start, end, display) { var totalJsonObj = dataArray.TotalData; //从后台传过来的JSON取出统计数据 var $th = $('tfoot').find('th'); //找到表格foot的th $th.eq(0).html(TotalData['学校名称']); //赋值:学校名称是JSON对象的key值 $th.eq(1).html(TotalData['学生总人数']); //同上赋值 };每次渲染之前要删掉之前的table结构
注意取id的时候需要在原有表格id上添加 _wrapper 才有效。
$("div#StuQueryTable_wrapper").remove();添加新的表头到<body>中,也可以添加到某个<div>后面
$("body").append(tableFrame);初始化DataTable
$("#StuQueryTable").DataTable({ "paging": false, "info": false, "language":{ "zeroRecords": "抱歉,无数据,请重新查询!", "lengthMenu": "每页显示_MENU_条", "paginate": { "next": "下一页", "previous": "上一页" }, "searching": false, "destroy": true, "data": dataArray.BodyData, "columns": columns, //根据不同的页面设定不同的列数据 //合计数据 "footerCallback": footCallBack //根据不同的页面返回不同的footCallBack函数 });完整代码:
function drawTable(dataArray){ //首先删除已有表格 $("div#StuQueryTable_wrapper").remove(); //设定不同的表格,因为footer需要对应固定数目的<th> var tableFrame; //设定不同的表格列渲染 var columns; //设定不同的footcallback函数,渲染相应的footer var footCallBack; //根据不同的页面级别,渲染不同的页面 // 1级页面表头:学校名称 学生人数 if(curPageRank == 1){ tableFrame = " <table class=\"cell-border compact stripe\" style='width:100%'id=\"StuQueryTable\">\n" + " <tfoot>\n" + " <tr>\n" + " <th></th>\n" + " <th></th>\n" + " </tr>\n" + " </tfoot>\n" + " </table>"; columns = [ {"data":"学校名称", title:"学校名称"}, {"data": "学生人数",title:"学生人数"} ]; footCallBack = function (tfoot, data, start, end, display) { var totalJsonObj = dataArray.TotalData; var $th = $('tfoot').find('th'); $th.eq(0).html(totalJsonObj['学校名称']); $th.eq(1).html(totalJsonObj['学生总人数']); }; } //2级页面表头:学校名称 年级 学生人数 if(curPageRank == 2){ tableFrame = " <table class=\"cell-border compact stripe\" style='width:100%'id=\"StuQueryTable\">\n" + " <tfoot>\n" + " <tr>\n" + " <th></th>\n" + " <th></th>\n" + " <th></th>\n" + " </tr>\n" + " </tfoot>\n" + " </table>"; columns = [ {"data": "学校名称", title: "学校名称"}, {"data": "年级",title: "年级"}, {"data": "学生人数",title:"学生人数"} ]; footCallBack = function (tfoot, data, start, end, display) { var totalJsonObj = dataArray.TotalData; var $th = $('tfoot').find('th'); $th.eq(0).html(totalJsonObj['学校名称']); $th.eq(1).html(totalJsonObj['年级']); $th.eq(2).html(totalJsonObj['总学生人数']); }; } //3级页面表头:学校名称 年级 班级 学生人数 if(curPageRank == 3){ tableFrame = " <table class=\"cell-border compact stripe\" style='width:100%'id=\"StuQueryTable\">\n" + " <tfoot>\n" + " <tr>\n" + " <th></th>\n" + " <th></th>\n" + " <th></th>\n" + " <th></th>\n" + " </tr>\n" + " </tfoot>\n" + " </table>"; columns = [ {"data": "学校名称", title: "学校名称"}, {"data": "年级",title: "年级"}, {"data": "班级",title: "班级"}, {"data": "学生人数",title:"学生人数"} ]; footCallBack = function (tfoot, data, start, end, display) { var totalJsonObj = dataArray.TotalData; var $th = $('tfoot').find('th'); $th.eq(0).html(totalJsonObj['学校名称']); $th.eq(1).html(totalJsonObj['年级']); $th.eq(2).html(totalJsonObj['班级']); $th.eq(3).html(totalJsonObj['学生总人数']); }; } //重新生成的表头添加到<body>中 $("body").append(tableFrame); $("#StuQueryTable").DataTable({ "paging": false, "info": false, "language":{ "zeroRecords": "抱歉,无数据,请重新查询!", "lengthMenu": "每页显示_MENU_条", "paginate": { "next": "下一页", "previous": "上一页" }, "searching": false, "destroy": true, "data": dataArray.BodyData, "columns": columns, //根据不同的页面设定不同的列数据 //合计数据 "footerCallback": footCallBack //根据不同的页面返回不同的footCallBack函数 }); }