Datatables小ネタ集
Datatablesとは
DataTables | Table plug-in for jQuery
行選択イベント
行選択時のイベントを捕まえる方法は二通りある。
select/deselectイベント
- ユーザーによる選択でもコードによる選択でも発火する。
- タイミングは選択された「後」。
- singleモードだとselectより先に前に選択されていた行のdeselectが発火する。
user-selectイベント
- ユーザーによる選択のみで発火する。
- タイミングは選択される「前」、なのでキャンセルが可能。
- selectでもdeselectでも発火する。クリックされたのが選択行か、未選択行かで判別できる。
AJAXリクエストを中止する
table.settings()[0].jqXHR.abort();
リクエスト開始前だとtable.settings()[0].jqXHR
がnullなので注意。
FixedColumnsとinput
FixedColumnsで作成した固定列にinputを配置するとpostのときに同じ名前の値が2つ飛ぶ。これは固定列が実はクローンであり、裏側にオリジナルが隠れているため。クライアント側、またはサーバー側でなんらかの対応が必要。
ちなみに縦スクロールを有効にした場合のヘッダー・フッターもクローンなのでinputを配置すると同じ問題が発生する。というわけでinputを固定列やヘッダー・フッターに配置するのはなるべく避けたい。
セルの結合
tbodyでのrowspanはできない。
inputを配置した列のソート
通常、ソートには内部のキャッシュが利用されるためロード後に入力された値はソートに反映されない。入力された値でソートしたい場合は下記のリンクを参照。
DataTables example - Live DOM ordering
inputを配置した列のファイル出力
こちらも同様、キャッシュを利用しているためロード後に入力された値は出力に反映されない。以下は列のrenderオプションとbuttonsのexportOptionsを利用して入力された値を出力するサンプル。
$('#table1').DataTable({ dom: 'Bfrtip', columns: [ { // inputの値 render: function (data, type, row, meta) { if (type === 'export') { var input = $('<div>' + data + '</div>').find('input'); data = $('[name="' + input.attr("name") + '"]').val(); } return data; } }, { // selectのテキスト render: function (data, type, row, meta) { if (type === 'export') { var input = $('<div>' + data + '</div>').find('select'); data = $('[name="' + input.attr("name") + '"] option:selected').text(); } return data; } }, { // チェックボックス・ラジオボタン render: function (data, type, row, meta) { if (type === 'export') { var input = $('<div>' + data + '</div>').find('input'); data = $('[name="' + input.attr("name") + '"][value="' + input.attr("value") + '"]').prop('checked').toString(); } return data; } } ], buttons: [{ bom: true, // エクセルで文字化けしないようにbom付き extend: 'csv', exportOptions: { orthogonal: 'export' } }] });
renderの引数、data
にはセルデータが入っているけど、これは前述の通り、ロード時にキャッシュされた古いデータ。なので取り出したinputのname属性をキーにして最新のinputを取得しなおす。