[jQuery]jQuery DataTables插件自定義Ajax分頁實現(xiàn)

JQuery DataTables插件自定義Ajax分頁實現(xiàn)

前言

昨天在博客園的博問上幫一位園友解決了一個問題复局,我覺得有必要記錄一下菜谣,萬一有人也遇上了呢锣夹。

問題描述

園友是做前端的,產(chǎn)品經(jīng)理要求他使用jQuery DataTables插件顯示一個列表解取,要實現(xiàn)分類效果。

后端的分頁接口已經(jīng)寫好了返顺,不涉及條件查詢禀苦,需要傳入頁碼(pageNo)和頁面顯示數(shù)據(jù)條數(shù)(pageSize),顯示相應(yīng)頁的顯示記錄遂鹊,且不能修改后端接口振乏。

分析

先來分析下分頁實現(xiàn)。
一是后端分頁:這種情況下秉扑,在后端很容易實現(xiàn)慧邮,在官網(wǎng)上有示例,不多說明舟陆。
二是前端分頁:前端分頁也是支持的误澳,不過需要一次把所有數(shù)據(jù)都獲取到才可以。

看到這里吨娜,問題來了脓匿。由于后端在目前的情況下是更改不了,只能在前端實現(xiàn)宦赠。但是陪毡,現(xiàn)在又不滿足前端分頁的條件:一次性獲取所有數(shù)據(jù)(現(xiàn)在后端數(shù)據(jù)接口只能返回相應(yīng)頁碼的數(shù)據(jù))。

介于目前的情況勾扭,獲取的數(shù)據(jù)只有一頁毡琉,沒有所有的頁碼。
試試能不能偽裝一下后端分頁的情況妙色,就是開啟后端分頁桅滋,在請求之前,將傳入的數(shù)據(jù)進行重組,在獲取到數(shù)據(jù)后丐谋,將返回的數(shù)據(jù)按照后端分頁的數(shù)據(jù)格式組裝一遍芍碧。

經(jīng)過測試,是可以的号俐。

實現(xiàn)

通過DataTables配置參數(shù)ajax項實現(xiàn)的泌豆。關(guān)于ajax詳細介紹請看官方說明:中文 | 英文

ajax接收三種類型的參數(shù):

  • string: 設(shè)置獲取數(shù)據(jù)的url
  • object:和 jQuery.ajax 定義類似
  • function:自定義獲取數(shù)據(jù)的功能

直接上代碼吧,都有注釋吏饿。
前端頁面代碼:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>jquery DataTables插件自定義分頁ajax實現(xiàn)</title>
    <link  rel="stylesheet" media="screen">
    <link  rel="stylesheet" media="screen">
    <link  rel="stylesheet" media="screen">
</head>
<body>
<div class="row-fluid">
    <h3>JQuery DataTables插件自定義分頁Ajax實現(xiàn)</h3>
    <table id="example" class="display table-striped table-bordered table-hover table-condensed" cellspacing="0" width="100%">
        <thead>
        <tr>
            <th>編號</th>
            <th>姓名</th>
            <th>性別</th>
        </tr>
        </thead>
    </table>
</div>
<script src="http://cdn.bootcss.com/datatables/1.10.11/js/jquery.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="http://cdn.bootcss.com/datatables/1.10.11/js/jquery.dataTables.min.js"></script>
<script src="http://cdn.bootcss.com/datatables/1.10.11/js/dataTables.bootstrap.min.js"></script>
<script type="text/javascript">
    $(function () {
        //提示信息
        var lang = {
            "sProcessing": "處理中...",
            "sLengthMenu": "每頁 _MENU_ 項",
            "sZeroRecords": "沒有匹配結(jié)果",
            "sInfo": "當(dāng)前顯示第 _START_ 至 _END_ 項踪危,共 _TOTAL_ 項。",
            "sInfoEmpty": "當(dāng)前顯示第 0 至 0 項猪落,共 0 項",
            "sInfoFiltered": "(由 _MAX_ 項結(jié)果過濾)",
            "sInfoPostFix": "",
            "sSearch": "搜索:",
            "sUrl": "",
            "sEmptyTable": "表中數(shù)據(jù)為空",
            "sLoadingRecords": "載入中...",
            "sInfoThousands": ",",
            "oPaginate": {
                "sFirst": "首頁",
                "sPrevious": "上頁",
                "sNext": "下頁",
                "sLast": "末頁",
                "sJump": "跳轉(zhuǎn)"
            },
            "oAria": {
                "sSortAscending": ": 以升序排列此列",
                "sSortDescending": ": 以降序排列此列"
            }
        };

        //初始化表格
        var table = $("#example").dataTable({
            language:lang,  //提示信息
            autoWidth: false,  //禁用自動調(diào)整列寬
            stripeClasses: ["odd", "even"],  //為奇偶行加上樣式贞远,兼容不支持CSS偽類的場合
            processing: true,  //隱藏加載提示,自行處理
            serverSide: true,  //啟用服務(wù)器端分頁
            searching: false,  //禁用原生搜索
            orderMulti: false,  //啟用多列排序
            order: [],  //取消默認排序查詢,否則復(fù)選框一列會出現(xiàn)小箭頭
            renderer: "bootstrap",  //渲染樣式:Bootstrap和jquery-ui
            pagingType: "simple_numbers",  //分頁樣式:simple,simple_numbers,full,full_numbers
            columnDefs: [{
                "targets": 'nosort',  //列的樣式名
                "orderable": false    //包含上樣式名‘nosort’的禁止排序
            }],
            ajax: function (data, callback, settings) {
                //封裝請求參數(shù)
                var param = {};
                param.limit = data.length;//頁面顯示記錄條數(shù),在頁面顯示每頁顯示多少項的時候
                param.start = data.start;//開始的記錄序號
                param.page = (data.start / data.length)+1;//當(dāng)前頁碼
                //console.log(param);
                //ajax請求數(shù)據(jù)
                $.ajax({
                    type: "GET",
                    url: "/hello/list",
                    cache: false,  //禁用緩存
                    data: param,  //傳入組裝的參數(shù)
                    dataType: "json",
                    success: function (result) {
                        //console.log(result);
                        //setTimeout僅為測試延遲效果
                        setTimeout(function () {
                            //封裝返回數(shù)據(jù)
                            var returnData = {};
                            returnData.draw = data.draw;//這里直接自行返回了draw計數(shù)器,應(yīng)該由后臺返回
                            returnData.recordsTotal = result.total;//返回數(shù)據(jù)全部記錄
                            returnData.recordsFiltered = result.total;//后臺不實現(xiàn)過濾功能笨忌,每次查詢均視作全部結(jié)果
                            returnData.data = result.data;//返回的數(shù)據(jù)列表
                            //console.log(returnData);
                            //調(diào)用DataTables提供的callback方法蓝仲,代表數(shù)據(jù)已封裝完成并傳回DataTables進行渲染
                            //此時的數(shù)據(jù)需確保正確無誤,異常判斷應(yīng)在執(zhí)行此回調(diào)前自行處理完畢
                            callback(returnData);
                        }, 200);
                    }
                });
            },
            //列表表頭字段
            columns: [
                { "data": "Id" },
                { "data": "Name" },
                { "data": "Sex" }
            ]
        }).api();
        //此處需調(diào)用api()方法,否則返回的是JQuery對象而不是DataTables的API對象
    });
</script>
</body>
</html>

JSON數(shù)據(jù)格式:


JSON數(shù)據(jù)格式

效果圖:


效果圖

本文就介紹到這里蜜唾。
期待你的點評杂曲。

參考:
DataTables官網(wǎng)
DataTables中文網(wǎng)
自行封裝請求和返回數(shù)據(jù)的零耦合服務(wù)端分頁

本文采用知識共享署名-相同方式共享 4.0 國際許可協(xié)議進行許可。
基于簡書上的作品創(chuàng)作袁余。 可轉(zhuǎn)載擎勘、引用,但需經(jīng)本人同意后署名作者且注明文章出處颖榜,并以相同方式共享棚饵。

知識共享許可協(xié)議
知識共享許可協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掩完,隨后出現(xiàn)的幾起案子噪漾,更是在濱河造成了極大的恐慌,老刑警劉巖且蓬,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欣硼,死亡現(xiàn)場離奇詭異,居然都是意外死亡恶阴,警方通過查閱死者的電腦和手機诈胜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯事,“玉大人焦匈,你說我怎么就攤上這事£墙觯” “怎么了缓熟?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我够滑,道長垦写,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任版述,我火速辦了婚禮梯澜,結(jié)果婚禮上寞冯,老公的妹妹穿的比我還像新娘渴析。我一直安慰自己,他們只是感情好吮龄,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布俭茧。 她就那樣靜靜地躺著,像睡著了一般漓帚。 火紅的嫁衣襯著肌膚如雪母债。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天尝抖,我揣著相機與錄音毡们,去河邊找鬼。 笑死昧辽,一個胖子當(dāng)著我的面吹牛衙熔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搅荞,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼红氯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咕痛?” 一聲冷哼從身側(cè)響起痢甘,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茉贡,沒想到半個月后塞栅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡腔丧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年放椰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悔据。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡庄敛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出科汗,到底是詐尸還是另有隱情藻烤,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站怖亭,受9級特大地震影響涎显,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兴猩,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一期吓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倾芝,春花似錦讨勤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至借尿,卻和暖如春刨晴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背路翻。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工狈癞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茂契。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓蝶桶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親账嚎。 傳聞我的和親對象是個殘疾皇子莫瞬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評論 25 707
  • 七百三十天疼邀,值得記憶。感謝你的一路陪伴召锈,不離不棄旁振。今天屬于全世界,更屬于我和你涨岁。開心快樂最重要拐袜,我會一直守...
    盛滿一碗思念閱讀 313評論 0 2
  • 慌慌張張蹬铺,匆匆茫茫,為何生活總是這樣秉撇,難道說甜攀,我的理想秋泄,就是這樣度過一生的時光,難道說规阀,60歲后再去尋找我想要的時...
    瑾萱Vanilla閱讀 586評論 0 0