Datatables——一款前端好用的表格插件,本地json模拟数据实现表格分页查询

在做管理后台功能时,经常需要用到表格展示数据,从数据库查询返回的数据,返回集合或数组到前台,然后前台将数据渲染成表格,方便直观展示数据,通常还需要结合分页、查询、排序。Datatables是一款符合上面所有需求的表格插件,基于jquery,方便我们对表格进行交互操作
Datatables中文网链接

这是一个读取本地json数据渲染表格的示例

使用步骤

一:从官网下载最新版本的插件,并在页面中应用相应的js和css文件,我这里是引用cdn提供的文件

    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css">
    <script type="text/javascript" src="//code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="//cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>

二:创建页面绑定表格的插件

<table id="tableList" width="100%" ></table>

三:为元素绑定Datatables,并初始化表格配置项

var table;
var classType={
        1:'一班',
        2:'二班',
        3:'三班',
        4:'四班',
        5:'五班'
    }
    function createTable() {
        table = $('#tableList').DataTable({
            "bPaginate" : true,
            "sPaginationType" : "full_numbers",
            "bStateSave" : true, //是否打开客户端状态记录功能,此功能在ajax刷新纪录的时候不会将个性化设定回复为初始化状态
            "bScrollCollapse" : true, //当显示的数据不足以支撑表格的默认的高度
            "bLengthChange" : true, //每页显示的记录数
            "bFilter" : false, //搜索栏
            "bSort" : true, //是否支持排序功能
            "bInfo" : true, //显示表格信息
            "bAutoWidth" : true, //自适应宽度
            "bJQueryUI" : false,//是否开启主题
            "bDestroy" : true,
            "bServerSide" : true,//服务器处理分页,默认是false,需要服务器处理,必须true
            "sAjaxDataProp" : "aData",//是服务器分页的标志,必须有
            "sAjaxSource" : "data.json" ,//服务器请求url,这里请求本地模拟的json数据。
            "columns": [
                {  "data": "stu_number",
                    "title":"序号",
                    "width" : "auto",
                    "render": function ( data, type, full, meta ) {
                        return data;
                    }
                },
                { "data": "name",
                    "title":"姓名"
                },
                {"data":"stu_number",
                    "title":"学号"

                },
                { "data": "age",
                    "title":"年龄"
                },
                {
                    "data":"sex",
                    "title":"性别",
                    "render": function ( data, type, row, meta ) {
                        if (data == 1){
                            return '男';
                        }else{
                            return '女';
                        }
                    }
                },
                { "data": "birthday",
                    "title":"出生年月"
                },
                { "data": "class",
                    "title":"班级",
                    "render": function ( data, type, row, meta ) {
                        return classType[data];
                    }
                },
                { "data": "class",
                    "title":"操作",
                    "render": function ( data, type, row, meta ) {
                        if(row.class==2){
                            return "查看"+row.class+"班学生";
                        }else{
                            return "查看"+row.class+"班学生";
                        }
                    }
                }
            ],
            /*解决序号列没法生成的问题*/
            "fnDrawCallback": function(){
                var api = this.api();
                var startIndex = api.context[0]._iDisplayStart;
                api.column(0).nodes().each(function(cell, i) {
                    cell.innerHTML = startIndex + i + 1;
                });
            },
            /*请求携带参数*/
            "fnServerParams":function(aoData){
                aoData._rand = Math.random();
                aoData.push(
                        { "name": "name", "value": '可取页面dom元素如input的value'},
                        { "name": "class", "value": '' }
                );
            }

        });
    }

四:定义好本地json模拟数据,其中返回字段说明:
sEcho:来自客户端 sEcho 传来的参数,依旧返回给客户端,用作本地计数
iTotalRecords:实际的条数。对应表格底部数据说明(从 20 条中过滤)
iTotalDisplayRecords:过滤之后,实际的条数。对应表格底部数据说明(共 4 条)
aData:服务器返回的json数据,表格展示的数据源
data.json数据如下

{
    "aData":[
        {
            "name":"菜菜",
            "stu_number":20190001,
            "age":18,
            "sex":2,
            "birthday":"2001年12月20日",
            "class":1
        },
        {
            "name":"刘菲",
            "stu_number":20190002,
            "age":18,
            "sex":2,
            "birthday":"2001年11月20日",
            "class":4
        },
        {
            "name":"陈阳",
            "stu_number":20190003,
            "age":18,
            "sex":1,
            "birthday":"2001年1月20日",
            "class":2
        },
        {
            "name":"黄一鸣",
            "stu_number":20190004,
            "age":18,
            "sex":1,
            "birthday":"2001年8月20日",
            "class":3
        },
        {
            "name":"程新",
            "stu_number":20190005,
            "age":18,
            "sex":2,
            "birthday":"2001年7月20日",
            "class":5
        }
],
    "iTotalDisplayRecords":5,
    "iTotalRecords":20,
    "sEcho":0
}

五:页面加载完成,完成表格绑定数据

$(function(){
        createTable();
    })

效果图如下所示,自带分页,表头可切换排序

附加说明:

一:当我们使用搜索功能时,我们在前面使用了table这个全局变量存放绑定dataTable的绑定,因此在搜索时,我们只需要为搜索的参数赋上我们查询的值即可,即‘fnServerParams’方法传递的参数取实时查询的值,然后调用 draw方法即可:

      function search(){
          table.draw();
      }

二:通过data()方法返回的长度判断服务器返回渲染后的表格数据是否为空

     if(table.data().length==0){
        alert("暂无数据");
        return;
    }

三:不使用本地模拟数据直接访问java后台的接口请求数据,java代码如下:

    /**
     * 查询数据列表
     * @param request
     * @return
     */
    @RequestMapping(value = "/studentList", produces = "application/json;charset=UTF-8", method = {RequestMethod.POST,
            RequestMethod.GET})
    @ResponseBody
    public String studentList(HttpServletRequest request) {
        try {
            /*DataTables 用来生成的信息*/
            int sEcho = NumberUtils.toInt(request.getParameter("sEcho"), 0);
            /*起始页码,若每页显示10条数据,那么第二页参数iDisplayStart为11*/
            int fromRec = NumberUtils.toInt(request.getParameter("iDisplayStart"), 0);
           /*每页显示的数据条数,若每页显示10条数据,那么iDisplayLength为10*/
            int pageSize = NumberUtils.toInt(request.getParameter("iDisplayLength"), 10);
            /*查询参数*/
            String name = request.getParameter("name");
            /*查询参数*/
            int classNum = NumberUtils.toInt(request.getParameter("class"));
      
            Map<String, Object> param = new HashedMap<String, Object>(4);
            param.put("fromRec", fromRec);
            param.put("endRec", pageSize);
            param.put("name", name);
            param.put("classNum", classNum);
            List<Student> list = new ArrayList<>();
            int count = studentService.queryListCount(param);
            if (count > 0) {
                list = studentService.queryList(param);
            }
            Map<String, Object> retMap = new HashMap<>(4);
            retMap.put("sEcho", sEcho);
            retMap.put("iTotalRecords", count);
            retMap.put("iTotalDisplayRecords", count);
            retMap.put("aData", CollectionUtils.isEmpty(list) ? new ArrayList<>() : list);
            return JSONObject.toJSONString(retMap);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        Map<String, Object> retMap = new HashMap<>(4);
        retMap.put("sEcho", 0);
        retMap.put("iTotalRecords", 0);
        retMap.put("iTotalDisplayRecords", 0);
        retMap.put("aData", new ArrayList<>());
        return JSONObject.toJSONString(retMap);
    }

原文作者技术博客://www.greatytc.com/u/ac4daaeecdfe
95后前端妹子一枚,爱阅读,爱交友,将工作中遇到的问题记录在这里,希望给每一个看到的你能带来一点帮助。
欢迎留言交流。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,906评论 2 89
  • 清晨,趁着我还没醒来,刘先生伴着很难过的故事恍然入了梦,梦里他喝醉了酒,醉倒在似毕业典礼展台的柱子旁,傍晚的天只剩...
    Cherry96阅读 361评论 0 0
  • 官南立交桥下 靠站前广场的那个摊位 以前是下载歌曲电影的 阳光温暖的午后 经常围满了一群老头 戴着老花镜 一只手仔...
    吻章阅读 191评论 0 2
  • 如果时间轮回,如果生命的每个节点都会存在于另外一个时空,你的十岁,十五岁,二十岁仍在另外一个世界舞动着,你是否盼望...
    各有少年时阅读 404评论 4 0
  • 白居易有诗云:离离原上草, 一岁一枯荣。野火烧不尽,春风吹又生。 韵译: 古原上的野草乱生乱长, 每年春来茂盛秋来...
    急停不投阅读 430评论 0 0