DataTables Part5 -Responsive-

前回までに引き続きDataTablesについて。今回はテーブルのレスポンシブWebデザイン化。

これまでの投稿は下記の通り。

  • Part1 -Introduction-
  • Part2 -Server-side processing-
  • Part3 -File Export-
  • Part4 -Individual column searching-
  •  

    単純にレスポンシブ対応させるにはjavascriptに下記の1行を足すだけでよい。

    <br />
    $(document).ready(function(){<br />
        $('#example').DataTable( {<br />
            /**<br />
             * Part1~4で説明済み<br />
             */<br />
            dom: '&lt;&quot;top&quot;f&gt;rt&lt;&quot;bottom&quot;lip&gt;&lt;&quot;clear&quot;&gt;',<br />
            lengthMenu: [[10, 50, 100, 500, 9999], [10, 50, 100, 500, &quot;全&quot;]],<br />
            language: {<br />
                url: &quot;https://cdn.datatables.net/plug-ins/1.10.15/i18n/Japanese.json&quot;,<br />
            },<br />
            stateSave: true,<br />
            serverSide: true,<br />
            ajax: &quot;datatables_griddata5.php&quot;,<br />
            orderCellsTop: true,</p>
    <p>        /**<br />
             * レスポンシブWebデザイン<br />
             */<br />
            responsive: true,<br />
        } );</p>
    <p>    /**<br />
         * Individual column filtering<br />
         * 各カラムでインスタント検索を行う<br />
         * Part4で説明済み<br />
         */<br />
        $('#example').on( 'click', '.search-input-text', function (e) {<br />
            e.stopPropagation();<br />
        } );</p>
    <p>    $('#example').on( 'keyup change', '.search-input-text', function (e) {<br />
            var i =$(this).attr('data-column');  // getting column index<br />
            var v =$(this).val();  // getting search input value<br />
            dataTable.columns(i).search(v).draw();<br />
        } );</p>
    <p>    $('#example').on( 'change', '.search-input-select', function (e) {<br />
            var i =$(this).attr('data-column');  // getting column index<br />
            var v =$(this).val();  // getting search input value<br />
            dataTable.columns(i).search(v).draw();<br />
        } );<br />
    });<br />
    

     

    ぱっと見た感じうまくいっているように見えたのだが、ここから盛大にはまった。
    Part4で紹介した、各カラムごとに検索窓を設置したテーブルに対して適用すると、下記のように検索窓が残ったままになってしまう問題が発生。見直しても特に間違った記述をしているようにも思えない。


     

    いろいろ調べてみると、どうもResponsiveのバージョン2.0以降で起こっている様子。最近リリースされた2.2.0でも変わりない。

    [参考]
    Complex headers & Responsive Not working anymore
    “Complex Header” not responsive in current DataTables.net build?
    Multiple header rows – Issue #71
     

    上記を見ると開発者も認識しているようだが、今は別の機能を作るのに手を取られて直していないようなことが書かれていた。原因としては、現行バージョンが複数行にわたるテーブルヘッダに対応していないとのこと。

    解決方法としては、バージョン1.xに戻すかいろんな所で書かれている有志による修正案を試す、もしくは修正されるまで待つぐらいしか方法はない。いくつか修正案を試したが私の環境ではうまくいかなかった。

    というわけでテーブルヘッダを1行にし、検索窓をテーブルフッタに設置したところ、下記のようにうまく動いた。

    <br />
        &lt;table id=&quot;example&quot; class=&quot;display nowrap&quot; width=&quot;100%&quot; cellspacing=&quot;0&quot;&gt;<br />
            &lt;thead&gt;<br />
                &lt;tr&gt;<br />
                    &lt;th data-priority=&quot;1&quot;&gt;CountryCode&lt;/th&gt;<br />
                    &lt;th data-priority=&quot;2&quot;&gt;Language&lt;/th&gt;<br />
                    &lt;th data-priority=&quot;4&quot;&gt;IsOfficial&lt;/th&gt;<br />
                    &lt;th data-priority=&quot;3&quot;&gt;Percentage&lt;/th&gt;<br />
                &lt;/tr&gt;<br />
            &lt;/thead&gt;<br />
            &lt;tfoot&gt;<br />
                &lt;tr&gt;<br />
                    &lt;td&gt;<br />
                        &lt;input type=&quot;text&quot; data-column=&quot;0&quot; class=&quot;search-input-text&quot; placeholder=&quot;&amp;#xF002;&quot;&gt;<br />
                    &lt;/td&gt;<br />
                    &lt;td&gt;<br />
                        &lt;input type=&quot;text&quot; data-column=&quot;1&quot; class=&quot;search-input-text&quot; placeholder=&quot;&amp;#xF002;&quot;&gt;<br />
                    &lt;/td&gt;<br />
                    &lt;td&gt;<br />
                        &lt;select data-column=&quot;2&quot; class=&quot;search-input-select&quot;&gt;<br />
                            &lt;option value=&quot;&quot;&gt;All&lt;/option&gt;<br />
                            &lt;option value=&quot;1&quot;&gt;T&lt;/option&gt;<br />
                            &lt;option value=&quot;2&quot;&gt;F&lt;/option&gt;<br />
                        &lt;/select&gt;<br />
                    &lt;/td&gt;<br />
                    &lt;td&gt;<br />
                        &lt;input type=&quot;text&quot; data-column=&quot;3&quot; class=&quot;search-input-text&quot; placeholder=&quot;&amp;#xF002;&quot;&gt;<br />
                    &lt;/td&gt;<br />
                &lt;/tr&gt;<br />
            &lt;/tfoot&gt;<br />
        &lt;/table&gt;<br />
    

     


     

    とりあえず修正されることを待つが、テーブルヘッダを複数行にしてうまく動いたという方がいれば教えてください。