JQueryプラグインのDataTablesでAjax通信
受託開発担当のRyuです。
前回に続きテーブル用JQueryプラグインDataTablesの使い方を紹介をしていきます。
今回はAjax通信についてです。
DataTablesは標準でJQueryを利用したAjax通信機能がサポートされています。
まずはこんなjsonを用意しました。
data.json
{"reports": [
{"id":"1","name":"aaa.pdf"},
{"id":"2","name":"bbb.pdf"},
{"id":"3","name":"ccc.pdf"}
]}
このjsonを取得して表示するようにDataTablesを設定します。
<html><head>
<meta charset="utf-8">
<link rel="stylesheet" href="dataTables/css/jquery.dataTables.css">
<style type="text/css">
<!--
body {width: 400px;}
#sample_table {border: 1px solid black;}
-->
</style>
</head>
<body>
<h5>DataTablesのAjax通信のサンプルです。</h5>
<table id="sample_table">
<thead>
<tr><th>ID</th>
<th>帳票名</th></tr>
</thead>
<tbody>
</tbody>
</table>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="dataTables/js/jquery.dataTables.min.js"></script>
<script>
var sampleTable = $("#sample_table").dataTable({
// 列設定です。
// mDataとjsonの各項目をマッピングします。
aoColumns: [
{ mData: "id", sDefaultContent: "" },
{ mData: "name", sDefaultContent: "" },
],
// 遅延レンダリングを設定します。
// trueにするとAjax通信を非同期で行います。
bDeferRender: true,
// Ajaxの接続先を設定します。
sAjaxSource: "data.json",
// Ajax通信方式を設定します。
sServerMethod: "POST",
// サーバへ送るリクエストパラメータを設定します。
// 今回はjsonファイルへのリクエストなので本当は必要ありません。
fnServerParams: function (aoData) {
aoData.push({"name": "id", "value": "1"});
},
// 取得JSONのルート文字列を設定します。
// 省略した場合のデフォルト値は「aaData」です。
sAjaxDataProp: "reports",
});
</script>
</body></html>

jsonのデータを表示
tbodyタグは空でも必要なので記述しておいてください。
簡単な設定でAjaxの利用ができますが、受け取ったデータを加工して表示したい、エラーが返ってきたときの処理をしたいということもあるでしょう。
そういうときはfnServerDataを利用することでJQuery標準のajax関数を利用することもできます。
<html><head>
<meta charset="utf-8">
<link rel="stylesheet" href="dataTables/css/jquery.dataTables.css">
<style type="text/css">
<!--
body {width: 400px;}
#sample_table {border: 1px solid black;}
-->
</style>
</head>
<body>
<h5>DataTablesのAjax通信のデータ加工サンプルです。</h5>
<table id="sample_table">
<thead>
<tr><th>ID</th>
<th>帳票名</th></tr>
</thead>
<tbody>
</tbody>
</table>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="dataTables/js/jquery.dataTables.min.js"></script>
<script>
var sampleTable = $("#sample_table").dataTable({
aoColumns: [
{ mData: "id", sDefaultContent: "" },
{ mData: "name", sDefaultContent: "" },
],
bDeferRender: true,
sAjaxSource: "data.json",
fnServerParams: function (aoData) {
aoData.push({"name": "id", "value": "1"});
},
sAjaxDataProp: "reports",
// サーバのデータ取得を行います。
// sSource sAjaxSourceで設定した接続先です。
// aoData fnServerParamsで設定したパラメータです。
// fnCallback DataTablesのデータ取得後の描画等を行うコールバック関数です。
// oSettings DataTablesの設定です。
fnServerData: function(sSource, aoData, fnCallback, oSettings) {
// ajaxリクエストからの戻ってくるjqXHRはoSettingsへ格納します。
oSettings.jqXHR = $.ajax({
url: sSource,
type: "GET",
data: aoData,
dataType: 'json',
})
// サーバから取得したデータを加工します。
.pipe(function(json) {
json.reports = $.map(json.reports, function(item, index) {
// idが2なら省く
return (item.id != "2") ? item : null;
});
return json;
})
// 加工したデータをDataTablesのコールバック関数へ流します。
.done(fnCallback);
}
});
</script>
</body></html>

idが2のレコードは非表示に
DataTablesの設定をサーバに保存することなどもできるので、詳しくはこちらを参考にしてください。
次は再読込です。
DataTablesの標準構成にはデータの再読込機能が無いのでプラグインを利用します。
こちらのページのfnReloadAjaxに記述してあるコードをファイルに保存し適当な名前を付けます。
今回はdataTables.fnReloadAjax.jsと名前を付け、jquery.dataTables.min.jsと同階層に配置しました。
後はテーブルに対してfnReloadAjaxを実行するだけです。
<html><head>
<meta charset="utf-8">
<link rel="stylesheet" href="dataTables/css/jquery.dataTables.css">
<style type="text/css">
<!--
body {width: 400px;}
#sample_table {border: 1px solid black;}
-->
</style>
</head>
<body>
<h5>DataTablesのAjax通信の再取得サンプルです。</h5>
<p>
<input type="button" id="reload" value="再取得" />
<input type="button" id="row-delete" value="1行削除" />
</p>
<table id="sample_table">
<thead>
<tr><th>ID</th>
<th>帳票名</th></tr>
</thead>
<tbody>
</tbody>
</table>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="dataTables/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="dataTables/js/dataTables.fnReloadAjax.js"></script>
<script>
var sampleTable = $("#sample_table").dataTable({
aoColumns: [
{ mData: "id", sDefaultContent: "" },
{ mData: "name", sDefaultContent: "" },
],
bDeferRender: true,
sAjaxSource: "data.json",
sAjaxDataProp: "reports",
});
// データ再取得
$("#reload").click(function() {
sampleTable.fnReloadAjax();
});
// 一行削除
$("#row-delete").click(function() {
sampleTable.fnDeleteRow(0);
});
</script>
</body></html>
次回は行選択を紹介する予定です。