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

【项目背景】

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

例如有以下三个页面:

#-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函数
    });
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值