DataTables.js是jQuery plugin裡較方便、設定較少的分頁表格功能。Google結果大多只有DataTables.js內容轉成JSON的飯粒,反過來較少,也是筆者在前端不熟稔所致,踹了快一週才找到方法,而且歷經SiteMesh和出現中文亂碼的問題。

  先說為何選用JSON作為資料傳遞格式,JSON和XML一樣皆屬通用型格式,同樣意涵的資料在JSON裡表達可能占的空間更少。利用通用型格式可以讓前端與Web Server之間更鬆耦合,前端可以是JSF、Flex…,後端可以是Struts、Spring MVC甚至是.Net平台。

  在Servlet端,透過JSONArray.fromObject回傳json資料給前端,而前端的實作在Google時有一點實在很煩,就是落落長的程式碼,所以下面的實作分開講,希望能比較清楚的表達:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <html:base/>
    <link href="styles/demo_page.css" rel="stylesheet" type="text/css" /> <!-- include相關css和js -->
    <link href="styles/demo_table_jui.css" rel="stylesheet" type="text/css" />
    <link href="styles/jquery-ui-1.7.2.custom.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" language="javascript" src="js/jquery/jquery.js"></script>
    <script type="text/javascript" language="javascript" src="js/jquery/jquery.dataTables.js"></script>

    <script type="text/javascript">
       
function buildTable(tableData) { <!-- 處理JSON的function -->
            var tableBody = $("#tableBody"); <!-- tableBody是<tbody>標籤ID,為dataTables.js所用 -->
            tableBody.html("");          <!-- 將<tbody>標籤內所有內容含標籤都清空 -->
            //add the table rows
            $.each(tableData, function(i){   <!-- JSON處理迴圈,匿名function的參數i是取得JSON的{} -->
                tableBody.append('<tr></tr>');    <!-- <tbody>後新增一個<tr>標籤空間 -->
                var tr = $('tr:last', tableBody); <!-- 在<tbody>取得最後一個<tr> -->
                tr.append('<td><input name="" type="checkbox" value="" /></td>'); <!-- <tr>後新增<td> -->
                tr.append('<td>' + tableData[i].id + '</td>');
                tr.append('<td>' + tableData[i].username + '</td>');
                tr.append('<td>' + tableData[i].name_tw + '</td>');
                tr.append('<td>' + tableData[i].name_en + '</td>');
                tr.append('<td>' + tableData[i].enable_flag + '</td>');
            });
        };

        $(function(){                    <!-- jQuery的Ajax處理程式 -->
            $("#query").click(function() {    <!-- 為button的id query的onclick事件bind一個function -->
                dataString = $("#mainForm").serialize();  <!-- 將form data全序列化到一個變數,jQuery特有 -->
                $.ajax({                 <!-- Ajax主程式 -->
                    url: 'query.do',     <!-- 指定action的url,如無,預設取得form的action屬性 -->
                    type: 'POST',        <!-- 指定form method,如無,預設取得form的method屬性 -->
                    data: dataString,    <!—form input -->
                    dataType: 'json',    <!-- 指定回傳type,包括html,text,xml,script等 -->
                    success: function(data, status){      <!-- 回傳成功的動作,status是HTTP status -->
                        buildTable(data);     <!-- 呼叫上面的function -->
                    },
                    error: function(xhrInstance, status, xhrException) { <!-- 回傳失敗的處理function -->
                        alert("failure:" + status);
                    }
                });
                return false;
            });
        });

        $(document).ready(function() {   <!-- 頁面DOM載入完畢後的匿名function -->
            oTable = $('#table_grid').dataTable({  <!-- table_grid為<table>標籤ID,指定被dataTable作用 -->
                "bJQueryUI": true,                 <!-- 可套用jQuery UI, 這部份再研究 -->
                "sPaginationType": "full_numbers"  <!-- 分頁功能設定全有,two_button則只有上下頁兩個 -->
            });
        } );
    </script>
    <title>Demo</title>
</head>

  對應的HTML部份內容如下:

<div class="demo_jui">
<table cellpadding="0" cellspacing="0" border="0" class="display" id="table_grid">
    <thead>
        <tr>
            <th width="7%">&nbsp;</th>
            <th width="13%">ID</th>
            <th width="21%">登入帳號</th>
            <th width="19%">中文姓名</th>
            <th width="18%">英文姓名</th>
            <th width="22%">啟動旗標</th>
        </tr>
    </thead>
    <tbody id="tableBody">
    </tbody>
</table>
</div>

  有別一般<table>下只有<tr>,DataTables.js在這兩者之間加了<thead>和<tbody>以區隔標頭和資料作用,所以才能夠在標頭上設置sort等功能。是故在第一個JavaScript片段,jQuery透過("#table_grid")找到id為table_grid的<table>標籤,再經由dataTable給它可分頁的功能,其它ID亦是如此。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()