基于dataTables的服务端分页与表格

前言:
  • 公司开发后台管理系统,表格加分页并带有搜索条件特别多。同事给我发来dataTables的demo,我感觉我就发现新天地,研究了几天。所以写出了这篇文章,作为备忘录,同时也给大家一个参考。
demo图
步入正题:
1. 首先要引入两个必要的文件,当然是要先引入jquery;
<link rel="stylesheet"  type="text/css" href="../../../css/jquery.dataTables.min.css"> 
<script src="../../js/Plug/jquery.dataTables.min.js" type="text/javascript" charset="utf-8"></script>
//在dataTables中下载必要的文件,路径是你自己文件所在地,下载地址自己百度,这个不会我也没办法了
2. HTML相应代码
 <div class="list list_two">
                        <form id="form_z_a" class="form_z_a">
                                    <select id="typename">
                                        <option value="name">姓名</option>
                                        <option value="no">工号</option>
                                    </select>
                                    <input style="width: 160px;" id="typevalue" type="text" placeholder="">
                                    <label>员工状态</label>
                                    <select name="status" id="status">
                                        
                                    </select>
                                    <label>员工帐号</label>
                                    <select name="hasAccount" id="hasAccount">
                                        <option value="">全部</option>
                                        <option value="true">已开通</option>
                                        <option value="false">未开通</option>
                                    </select>
                                    <label>证书状态</label>
                                    <select name="certificatesStatus" id="certificatesStatus">
                                        
                                    </select>
                                    <button type="button" id="btn-z-a">搜索</button>
                        </form>
                        <table id="example" class="display" cellspacing="0" width="100%">
                                        <thead>
                                            <tr>
                                                <th>工号</th>
                                                <th>姓名</th>
                                                <th>所属部门</th>
                                                <th>职位</th>
                                                <th>手机号码</th>
                                                <th>证书即将过期数</th>
                                                <th>证书过期数</th>
                                                <th>员工状态</th>
                                                <th>员工账户</th>
                                                <th>操作</th>
                                            </tr>
                                        </thead>
                        </table>
                    </div>
<!--重点是你需要一个table标签容器,并把表头写好,给上id(重点)和class,样式什么的都可以自己看官网api-->
3. 初始化表格,这时候你定义的table标签的id就有用了。
 $(document).ready(function(){
    $('#example').DataTable();
});

初始化表中有很多的配置项;我把服务端分页需要的配置贴出来,加以说明。

var table = $('#example').DataTable({
        dom: 'frtip', //表格上的功能。如分页和搜索还有条数显示。我去掉了选择条数和搜索的功能。具体看官网api
        "bFilter": false, //去掉搜索。和上面一样的效果。去掉单个功能可用。

        serverSide: true,//启用服务器端分页,这是重点重点重点。三遍

        //服务端分页少不了ajax请求,这是datatables封装好的。
        ajax: function(data, callback, settings) {
            //封装请求参数
            // var data_url = 'http://localhost:3000/suppliers';
            var data_url = '/basic/hospitals/' + ownerUSCC + '/suppliers';

            var searchData = getFormJson('form_z_a', 'typename', 'typevalue');
            //这是把form表单中的值转为对象函数的方法。
            function getFormJson(idF, idS, idI) {
                // 下拉+输入搜索的查询条件,传入form的id,下拉框的name和input的name
                var searchData = {};
                var loginForm = $('#' + idF).serializeArray();
                $.each(loginForm, function(i, v) {
                    searchData[v.name] = v.value;
                });
                var typename = $('#' + idS).val();
                var typevalue = $('#' + idI).val();
                searchData[typename] = typevalue;
                return searchData;
            }
            //因为后台说分页条数和分页的页数要放在请求头中所以我把这个参数放在请求头中,你们后台要是部需要的话,可以直接当ajax的data参数传给后台。
            var param = {
                "x-page-size": data.length,
                "x-page-no": (data.start / data.length) + 1
            };
            console.log("fen:" + param);
            // param.x- = data.length;//页面显示记录条数,在页面显示每页显示多少项的时候
            // param.start = data.start;//开始的记录序号
            // param.x = (data.start / data.length)+1;//当前页码
            //ajax请求数据
            $.ajax({
                type: "GET",
                url: data_url,
                cache: false,//禁用缓存
                data: searchData,//传入组装的参数
                dataType: "json",
                headers: param,//请求头参数
                complete: function(result) {
                    console.log(searchData);
                    console.log(this.headers);
                    console.log(result.getResponseHeader("x-total-count"));
                },
                success: function(result, status, xhr) {
                    //setTimeout仅为测试延迟效果
                    setTimeout(function() {
                        //封装返回数据
                        var returnData = {};
                        returnData.draw = data.draw; //这里直接自行返回了draw计数器,应该由后台返回

                        returnData.recordsTotal = xhr.getResponseHeader("x-total-count");
                        returnData.recordsFiltered = xhr.getResponseHeader("x-total-count"); //后台不实现过滤功能,每次查询均视作全部结果

                        // returnData.recordsTotal = result.length;//返回数据全部记录
                        // returnData.recordsFiltered = result.length;
                        returnData.data = result; //返回的数据列表
                        //调用DataTables提供的callback方法,代表数据已封装完成并传回DataTables进行渲染
                        //此时的数据需确保正确无误,异常判断应在执行此回调前自行处理完毕
                        callback(returnData);//将你的返回的data转为datatables能识别的数据格式作为参数返回ajax的callback回调中。
                    }, 200);
                }
            });
        },
        //"columns"属性是数据配置,你返回data中的数据写入这个数据对象中如:data:key(就是你返回数据中的key)
        //defaultContent:知道当data为空时默认显示的数据
        "columns": [{
            "data": "fullName",
            "defaultContent": "<i></i>"
        },

        {
            "data": "simpleName",
            "defaultContent": "<i></i>"
        }, {
            "data": null
        },
        {
            "data": "contact.name",
            "defaultContent": "<i></i>"

        }, {
            "data": "contact.tel",
            "defaultContent": "<i></i>"
        }, {
            "data": "contact.email",
            "defaultContent": "<i></i>"
        }],
        //columnDefs 当columns中设置data为null,你就可以在表格中加入一些如按钮等自定义html:
        //自定义的按钮可以写在defaultContent中或者render();回调函数中,必须要有return值。
        //targets : 从表格列数的索引 从0开始
        columnDefs: [{
            "targets": 6,
             "data": null,
             "defaultContent": '<div class="zhgl_cc_n">' + '![](../../../images/chakan.png)' + '![](../../../images/remove_z.png)' + '</div>'        
        }, {           
             "targets": 2,
             "data": null,
            "render": function(data, type, full, meta) {
                var _category = JSON.parse(data.category);
                // console.log(_category);
                var _category_data = '';
                for (var i in _category) {
                    // _category_data+=_category[i]+','
                    // console.log(_category[i])
                    for (var j in _category[i]) {
                        // console.log(_category[i][j])
                        if (i > 0) {
                            _category_data += ' , ' + _category[i][j];
                        } else {
                            _category_data += _category[i][j];
                        }

                    }
                }
                return _category_data;
            },
            "defaultContent": "<i>无</i>"        
        }],
        //国际化,把所有的字改变成中文
        language: {
            "sProcessing": "处理中...",
            "sLengthMenu": "显示 _MENU_ 项结果",
            "sZeroRecords": "没有匹配结果",
            "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
            "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
            "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
            "sInfoPostFix": "",
            "sSearch": "搜索:",
            "sUrl": "",
            "sEmptyTable": "表中数据为空",
            "sLoadingRecords": "载入中...",
            "sInfoThousands": ",",
            "oPaginate": {
                "sFirst": "首页",
                "sPrevious": "上页",
                "sNext": "下页",
                "sLast": "末页"
            },
            "oAria": {
                "sSortAscending": ": 以升序排列此列",
                "sSortDescending": ": 以降序排列此列"
            }
        },

    });
4. 搜索功能
  • 点击搜索,datatables提供table.ajax.reload();方法刷新表格。因为你已经选择一些搜索条件。所以刷新表格时候能自动把搜索条件带上。搜索条件的获取一定要在ajax回调中获取。不然刷新表格不会带上条件,这点很重要。
  $('#btn-z-a').on('click', function() {
        table.ajax.reload();
        console.log('搜索');
        return false;
    });

结语:

第一次写文章,所以我把代码都贴了出来,大家多看我代码注释,希望大家有个参考。
么么哒!

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

推荐阅读更多精彩内容