【DataTable】动态根据ajax刷新修改表头和底部统计footer

【项目背景】

多个页面具有层级关系,从某个页面的链接点击到下一级别的页面,各个页面的表头不一致,同时要求添加统计信息。

例如有以下三个页面:

#-1-> 学校名称 学生人数

#-2-> 学校名称 年级 学生人数

#-3-> 学校名称 年级 班级 学生人数 

【解决思路】

每次ajax刷新去后台取数据后通过绘制把数据显示到DataTable中,每次绘制之前把原先的表格删掉,然后重写表格表头和统计footer。

【参考代码】

table表设定的id为:StuQueryTable

 设置一个函数 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需要对应固定数目的
var tableFrame;
//设定不同的表格列渲染
var columns;
//设定不同的footcallback函数,渲染相应的footer
var footCallBack;

ex. curPageRank==1 

 #------tableFrame--------

需要注意的是如果使用footer需要添加对应的才能正常显示

例如第一级的表有两个字段分别是学校名称、学生人数,就需要添加两个

 #------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").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需要对应固定数目的
    var tableFrame;
    //设定不同的表格列渲染
    var columns;
    //设定不同的footcallback函数,渲染相应的footer
    var footCallBack;

    //根据不同的页面级别,渲染不同的页面
            
    // 1级页面表头:学校名称 学生人数
    if(curPageRank == 1){
        tableFrame = " \n" +
                    "        \n" +
                    "        \n" +
                    "            \n" +
                    "            \n" +
                    "        \n" +
                    "        \n" +
                    "    
"; 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 = " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
"; 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 = " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
"; 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").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函数 }); }

 

你可能感兴趣的:(projects,Java程序)