2
4

More than 3 years have passed since last update.

【jquery】tablesorter機能でよく使うものメモ

Last updated at Posted at 2020-06-22

はじめに

業務で必要だったのでtablesorterを使ったのだが、
欲しい情報が分散していて(何なら英語サイトにしかなかったりして)わかりにくかったので、まとめ。

基本的な使い方

ダウンロードしたjqueryライブラリをscriptに読み込み、
function()でcallするだけ。かんたん。

tableにidを付けるのと、ヘッダをに入れるのを忘れずに。
tbodyの中身だけがソート対象になる。
tfootはあってもなくてもいいけど、あってもソート対象外。必ず末尾に入るから合計行とかに便利。

<head>
<script type="text/javascript" src="js/jquery.tablesorter.js"></script> <!-- tablesortのためのjqueryライブラリ -->
<script language=javascript>
$(function(){   
    $('#sorttable').tablesorter();
});
</script>
</head>
<body>
    <table id="sorttable">
        <thead>
            <tr>
                <th>キャンペーン名</th>
                <th>広告グループ名</th>
                <th>広告費</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td colspan="2">合計</td>
                <td>39000</td>
            </tr>
        </tfoot>
        <tbody>
            <tr>
                <td>キャンペーンA</td>
                <td>広告グループ1</td>
                <td>20000</td>
            </tr>
            <tr>
                <td>キャンペーンB</td>
                <td>広告グループ2</td>
                <td>10000</td>
            </tr>
            <tr>
                <td>キャンペーンC</td>
                <td>広告グループ3</td>
                <td>9000</td>
            </tr>
        </tbody>
    </table>
</body>

アレンジ:オプション設定

カラムごとにソートするしない、ロードしたときのデフォルトソート項目を設定できる。
詳細はtablesorterのGitHubをチェック。

    $('#sorttable').tablesorter({
        headers: {
            0: {sorter:false},
            1: {sorter:false},
            2: {sorter:true},
        },
        sortList: [[0,1],[2,0]],        //デフォルトソート
    });

アレンジ:【プラグインmetadata】表示内容以外でのソート

metadataプラグインをheadで読み込み、
普通にfunctionでtablesorterをcallした上で
該当項目のtheadにCSSで{sorter:'metadata'}を入れる。
tbodyのほうは{sortValue:XXX}のようにソートさせたい値をセット。

例では、「広告費」カラムのソートが表示の数字ではなくsortValueで指定した項目になる。

<head>
<script type="text/javascript" src="js/jquery.tablesorter.js"></script>
<script type="text/javascript" src="js/jquery.metadata.js"></script>    <!-- メタデータプラグイン -->
<script language=javascript>
$(function(){   
    $('#sorttable').tablesorter();
});
</script>
</head>
<body>
    <table id="sorttable">
        <thead>
            <tr>
                <th>キャンペーン名</th>
                <th>広告グループ名</th>
                <th class="{sorter:'metadata'}">広告費</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td colspan="2">合計</td>
                <td>39000</td>
            </tr>
        </tfoot>
        <tbody>
            <tr>
                <td>キャンペーンA</td>
                <td>広告グループ1</td>
                <td class="{sortValue:1}">20000</td>
            </tr>
            <tr>
                <td>キャンペーンB</td>
                <td>広告グループ2</td>
                <td class="{sortValue:2}">10000</td>
            </tr>
            <tr>
                <td>キャンペーンC</td>
                <td>広告グループ3</td>
                <td class="{sortValue:3}">9000</td>
            </tr>
        </tbody>
    </table>
</body>

アレンジ:【ex-table-filter】テーブルをフィルタリング表示

tablesorterしたテーブルをフィルタリングで表示する。とっても便利。
ただしフィルタリングしてくれるけどtfootはそのままなので合計とか再集計してくれるわけではない。。

<script type="text/javascript" src="js/jquery.ex-table-filter.js"></script> <!-- filterのためのjqueryライブラリ -->
<script>
    $('#sorttable').exTableFilter({
        filters : {
            0 : '#myfilter'
        }
    });
</script>

    フィルタリング: <input type="text" id="myfilter">

    <table id="sorttable">・・・・・・</table>

アレンジ:rowspanした行もセットでソートしたい

rowspanして2レコードで1レコード分のデータとする場合。
2レコードを1セットとしてソートしたいのに、デフォルトだと1行ごとにソートされてしまう。

そんな場合は、2レコード目にCSSでtablesorter-childRowを入れる。
これを入れると、「このレコードは子分ね!」と判断され、親分レコードにくっついて移動するようになる。
rowspanが3なら2,3レコード目にtablesorter-childRowを入れればいい。

これググってもなかなか出てこなくてかなり手こずったのでメモ。

    <table id="sorttable">
        <thead>
            <tr>
                <th rowspan="2">キャンペーン名</th>
                <th>広告グループ名</th>
            </tr>
            <tr>
                <th>広告費</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="2">キャンペーンA</td>
                <td>広告グループ1</td>
            </tr>
            <tr class="tablesorter-childRow">
                <td>20000</td>
            </tr>

            <tr>
                <td rowspan="2">キャンペーンB</td>
                <td>広告グループ2</td>
            </tr>
            <tr class="tablesorter-childRow">
                <td>10000</td>
            </tr>
        </tbody>
    </table>

tablesorterの再設定 2020/09/08ADD

検索条件を変えてテーブルを生成した場合に、作り方によってはちゃんとソートできなくなる場合がある。
その場合は、再検索した際にtablesorterを強制的にリセット(初期化)⇒アップデートってのをしてやるとうまくいく。こともある。。

参考⇒https://www.earthlink.co.jp/engineerblog/intra-mart-engineerblog/2207/

$('#ResultTable').trigger('filterReset').trigger('sortReset');

$('#ResultTable').tablesorter({
});

$('#ResultTable').trigger("updateAll");

//resetしてしまったのでデフォルトのsortListを設定し直し
$('#ResultTable').trigger("sorton", [[[5,1]]]);

※ただし公式のやり方ではないとのことなので注意

sortonのtriggerに関しては以下を参考にしました
http://developmentor.lrlab.to/postal/jquery/jquery.tablesorter/basic2.html

オプションに関しては情報が少なくて毎回苦労する・・・
引数二番目の配列で[]をいっこ少なくしてたからずっとうまくいかなかった。。

おわりに

まだしばらく触る予定なので、何かあれば追加予定・・・・

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4