jQuery DataTables头部有两行:第一行列名和排序,第二行过滤

时间:2012-03-17 18:16:06

标签: javascript jquery jquery-datatables

在早期版本的datatables(最多1.7。?)中,我曾经能够拥有一个带有两行列标题的表,其中排序在顶行中完成,并包含列名,并在第二行完成输入和选择的过滤。

<table>
   <thead>
     <tr>
         <th>Col 1</th>
         <th>Col 2</th>
         <th>Col 3</th>
     </tr>
     <tr>
        <td><input type="text" /></td>
        <td><select><option ....></select></td>
        <td><input type="text" /></td>         
     </tr>
  </thead>
  <tbody>...

对于更高版本,包括最新版本(1.9.0),这不再有效,因为可排序标头应用于第二行而不是第一行。 有没有办法让这个工作,而不需要诉诸额外的插件,如 http://code.google.com/p/jquery-datatables-column-filter/

2 个答案:

答案 0 :(得分:16)

jQuery DataTables作者Allan Jardine指出了一种简单的方法来完成这项工作: 使用自1.8版以来可用的bSortCellsTop选项。

http://datatables.net/ref#bSortCellsTop

http://datatables.net/ref

http://datatables.net/forums/discussion/9046/two-rows-in-thead-first-row-for-sorting-second-row-for-column-filtering

为jQuery DataTables +1!

答案 1 :(得分:1)

我搜索了很多关于这个以获得更好的解决方案并创建了以下代码。在这里,您可以通过在表格标题单元格中使用相应的类名来决定组合框和搜索框。排序按钮和列名称位于第一行,过滤选项位于第二行。

<table id="example" width="100%">
    <thead>
        <tr>
            <th>Sıra</th>
            <th>SKU</th>
            <th>Stok Adı</th>
            <th>Ana Kategori</th>
            <th>Alt Kategori</th>
            <th>Stok Adedi</th>
            <th>Alt Limit</th>
            <th>Son Giriş Tarihi</th>
            <th>Son Giriş Adedi</th>
            <th>Stok Yaşı</th>
        </tr>
        <tr class="filter">
            <th class="combo"></th>
            <th class="combo"></th>
            <th class="combo"></th>
            <th class="search"></th>
            <th class="search"></th>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>S49996</td>
            <td>A4-Tech Q Klavye Siyah Ps2 (KM720)</td>
            <td>Ofis Elektroniği</td>
            <td>Klavye - Mouse</td>
            <td>25</td>
            <td>10</td>
            <td>10-10-2015</td>
            <td>78</td>
            <td>89</td>
        </tr>
    </tbody>
</table>

<script type="text/javascript">
$(document).ready(function() {

    var table = $('#example').DataTable({
    "bPaginate": false,
    "bLengthChange": false,
    "bFilter": true,
    "bInfo": false,
    "bAutoWidth": false,
    "bSortCellsTop": true,
        "scrollY": "300px",
        "scrollCollapse": true,
        initComplete: function () {
            this.api().columns().every( function () {
                var column = this;
                var columnIndex = this.index();
                switch ($(".filter th:eq("+columnIndex+")").attr('class')) { 
                                    case 'combo': 
                                        var select = $('<select style="width:100%;"><option value=""></option></select>')
                                            .appendTo( $(".filter th:eq("+columnIndex+")").empty() )
                                            .on( 'change', function () {
                                                var val = $.fn.dataTable.util.escapeRegex(
                                                    $(this).val()
                                                );
                                                column
                                                    .search( val ? '^'+val+'$' : '', true, false )
                                                    .draw();
                                            });

                                        column.data().unique().sort().each( function ( d, j ) {
                                            select.append( '<option value="'+d+'">'+d+'</option>' )
                                        });
                                        break;
                                    case 'search': 
                                        $(".filter th:eq("+columnIndex+")").html( '<input type="text" />' );

                                        $( 'input', $(".filter th:eq("+columnIndex+")") ).on( 'keyup change', function () {
                                            if ( column.search() !== this.value ) {
                                                column
                                                    .search( this.value )
                                                    .draw();
                                            }
                                        });
                                        break;
                }
            } );
        }       
  });
});
</script>