如果数据表中只有一个页面,则禁用分页

时间:2012-06-15 12:41:19

标签: pagination datatables

我正在实施datatbales并根据我的要求,除分页问题外,大多数事情已经解决。在我的情况下,每次分页导航显示。如果只有一个页面,我想禁用分页导航。怎么做?我的代码就像:

JS

<script>
  function fnFilterColumn(i) {

    $('#example').dataTable().fnFilter(
      $("#col" + (i + 1) + "_filter").val(),
      i
    );
  }
  $(document).ready(function() {


    $('#example').dataTable({
      "bProcessing": true,
      "sAjaxSource": "datatable-interestdb.php",
      "bJQueryUI": true,
      "sPaginationType": "full_numbers",
      "sDom": 'T<"clear">lfrtip',
      "oTableTools": {
        "aButtons": [

          {
            "sExtends": "csv",
            "sButtonText": "Save to CSV"
          }
        ]
      },
      "oLanguage": {
        "sSearch": "Search all columns:"
      }


    });


    $("#example").dataTable().columnFilter({
      aoColumns: [
        null,
        null,
        null,
        null
      ]
    });


    $("#col1_filter").keyup(function() {
      fnFilterColumn(0);
    });

  });
</script>

HTML

<table cellpadding="3" cellspacing="0" border="0" class="display userTable" aria-describedby="example_info">

  <tbody>
    <tr id="filter_col1">
      <td>Interest:</td>
      <td>
        <input type="text" name="col1_filter" id="col1_filter">
      </td>
    </tr>
  </tbody>
</table>


<table width="100%" border="0" align="center" cellpadding="2" cellspacing="1" class="form_table display" id="example">

  <thead>
    <tr>
      <th class="sorting_asc" width="25%">Interest</th>
      <th width="25%">Name</th>
      <th width="25%">Email</th>
      <th width="25%">Contact No</th>
    </tr>
  </thead>
  <tbody>

    <tr>
      <td colspan="4" class="dataTables_empty">Loading data from server</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </tfoot>


</table>

18 个答案:

答案 0 :(得分:72)

根据Nicola的答案,您可以使用fnDrawCallback()回调和oSettings对象在绘制后隐藏表格分页。使用oSettings,您无需了解表设置(每页记录,特定于表的选择器等)。

以下检查以查看每页显示长度是否大于总记录数,如果是,则隐藏分页:

$('#your_table_selector').dataTable({
    "fnDrawCallback": function(oSettings) {
        if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay()) {
            $(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
        }
    }
});

文档

答案 1 :(得分:36)

您必须动态隐藏它们我认为您可以使用fnDrawCallback()

$('#example').dataTable({
    "fnDrawCallback": function(oSettings) {
        if ($('#example tr').length < 11) {
            $('.dataTables_paginate').hide();
        }
    }
});​

编辑 - 发现here的另一种方式可能是

"fnDrawCallback":function(){
      if ( $('#example_paginate span span.paginate_button').size()) {
      $('#example_paginate')[0].style.display = "block";
     } else {
     $('#example_paginate')[0].style.display = "none";
   }
}

答案 2 :(得分:30)

查看我的功能插件conditionalPaging

用法:

$('#myTable').DataTable({
    conditionalPaging: true
});

or

$('#myTable').DataTable({
    conditionalPaging: {
        style: 'fade',
        speed: 500 // optional
    }
});

答案 3 :(得分:19)

在使用V1.10 +的JQuery Datatables时,这是正确的方法。该过程通常与以前的版本相同,但事件名称和API方法略有不同:

$(table_selector).dataTable({
    preDrawCallback: function (settings) {
        var api = new $.fn.dataTable.Api(settings);
        var pagination = $(this)
            .closest('.dataTables_wrapper')
            .find('.dataTables_paginate');
        pagination.toggle(api.page.info().pages > 1);
    }
});

文档

答案 4 :(得分:4)

使用 @sina 建议,包括 @GuiSim 提及的修复。

将此代码添加到您的数据表初始化请求中。

<强> JQUERY

"fnDrawCallback": function (oSettings) {
  var pgr = $(oSettings.nTableWrapper).find('.dataTables_paginate')
  if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay()) {
    pgr.hide();
  } else {
    pgr.show()
  }
}

或者更好的还是替换

"fnDrawCallback": null 

在你的datatables.js中应用代码网站。

答案 5 :(得分:3)

我更喜欢@sina的解决方案。干得好。

但是我的一些有必要的改进。 如果需要,@ sina忘记了else部分再次显示分页。我添加了在all中定义lengthMenu选项的可能性,如下所示:

jQuery('#your_table_selector').dataTable({
    "lengthMenu": [[10, 25, 50, 100, 250, 500, -1], [10, 25, 50, 100, 250, 500, "All"]],

    "fnDrawCallback": function(oSettings) {
        if (oSettings._iDisplayLength == -1
            || oSettings._iDisplayLength > oSettings.fnRecordsDisplay())
        {
            jQuery(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
        } else {
            jQuery(oSettings.nTableWrapper).find('.dataTables_paginate').show();
        }
    }
});

答案 6 :(得分:2)

<强>的jQuery - 我尝试了以下选项,它对我有用

    $("#your_tbl_selector").dataTable({
    "pageLength": 3,
    "autoWidth": false,
    "fixedHeader": {"header": false, "footer": false},
    "columnDefs": [{ "width": "100%", "targets": 0 }],
    "bPaginate": true,
    "bLengthChange": false,
    "bFilter": true,
    "bInfo": false,
    "bAutoWidth": false,
    "oLanguage": {
     "oPaginate": {
       "sNext": "",
       "sPrevious": ""
     }
   },
   "fnDrawCallback": function(oSettings) {                 
        if (oSettings._iDisplayLength >= oSettings.fnRecordsDisplay()) {
          $(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
        }
    }
});

DataTable Output View

答案 7 :(得分:2)

此回调函数通常适用于任何数据表,而无需对表ID进行硬编码:

$('.data-table').dataTable({
    fnDrawCallback: function(oSettings) {
       if(oSettings.aoData.length <= oSettings._iDisplayLength){
         $(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
       }
    }
});

答案 8 :(得分:2)

为了达到这个目标,我正在做以下工作,因为上面没有提到它是一种更动态的解决方案。首先,它获取页面总数,然后决定显示/隐藏分页。 仅当用户更改页面长度时,此代码才有意义。

jQuery('#example').DataTable({
    fnDrawCallback: function(oSettings) {
        var totalPages = this.api().page.info().pages;
        if(totalPages == 1){ 
            jQuery('.dataTables_paginate').hide(); 
        }
        else { 
            jQuery('.dataTables_paginate').show(); 
        }
    }
});

答案 9 :(得分:1)

只需将以下内容添加到样式表中即可:

.dataTables_paginate .paginate_button.disabled {
    display: none;
}

答案 10 :(得分:1)

我试图在每个条目的数据表中将sPaginationType设置为Dynamic,但我找不到合适的解决方案,但我所做的是

"fnDrawCallback": function(oSettings) {
    $('select[name="usertable_length"]').on('change', function(e) {
        var valueSelected  = this.value;
        if ( valueSelected < 10 ) {
            $('.dataTables_paginate').hide();
        } else {
            $('.dataTables_paginate').show();
        }
    });
},

答案 11 :(得分:1)

$('#dataTable_ListeUser').DataTable( {

    //usual pager parameters//

    "drawCallback": function ( settings ) {

    /*show pager if only necessary
    console.log(this.fnSettings());*/
    if (Math.ceil((this.fnSettings().fnRecordsDisplay()) / this.fnSettings()._iDisplayLength) > 1) {
        $('#dataTable_ListeUser_paginate').css("display", "block");     
    } else {                
        $('#dataTable_ListeUser_paginate').css("display", "none");
    }

    }
   });

答案 12 :(得分:0)

我知道这是一个老帖子,但对于我们这些将使用它的人,并且像我一样有强迫症,需要改变。

更改if语句

if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay()) 

if (oSettings._iDisplayLength >= oSettings.fnRecordsDisplay()) 

通过这个小改动,您将看到记录长度大于10,25,50,100的分页按钮,而不是仅显示10个记录的分页按钮,技术上10,25等记录仍然是单页视图。

答案 13 :(得分:0)

如果您的数据不是动态的,即服务器生成HTML表,然后由DataTables增强,您可以在服务器上呈现分页选项(我使用的是razor)。

$("#results").dataTable({
  paging: @(Model.ResultCount > Model.PageSize ? "true" : "false"),
  // more ...
});

答案 14 :(得分:0)

这不是直接可行的,因为DataTables不支持启用和禁用功能是运行时。但是,你可以做的是使用fnDrawCallback()函数检查是否只有一个页面,如果是,则隐藏分页控件。

答案 15 :(得分:0)

这是我的解决方案,如果您在同一页面上有多个表,它也可以使用。例如,它可以防止崩溃(表A必须有分页,B不能)。

我的代码中的tableId永远不会被定义。如果您还没有为表格定义ID,则dataTable会通过添加类似&#39; DataTables_Table_0&#39;

之类的内容为您执行此操作
    fnDrawCallback: function (oSettings) {
        if ($(this).DataTable().column(0).data().length <= oSettings._iDisplayLength) {
            var tableId = $(this).attr('id');
            $('#' + tableId + '_paginate').hide();
        }
    }

答案 16 :(得分:0)

这解决了我的问题:

UseUrls

希望它能帮助你们所有人

答案 17 :(得分:0)

    $("#datatable").DataTable({
        "fnDrawCallback": function (oSettings) {
            if ($(oSettings.nTBody).find("tr").length < $(oSettings.nTableWrapper).find("select[name=fileList_length]").val()) {
                $(oSettings.nTableWrapper).children(".dataTables_paginate").hide();
            }
        }
    });