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>
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>
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>
次回は行選択を紹介する予定です。