désactiver la pagination s'il n'y a qu'une seule page dans datatables
J'implémente datatbales et selon mes besoins, la plupart des choses ont été résolues sauf le problème de pagination. Dans mon cas, pour chaque fois que la navigation de pagination s'affiche. Je veux désactiver la navigation de pagination s'il n'y a qu'une seule page du tout.Comment faire? Mon code est comme:
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>
17 réponses
Vous devez les cacher dynamiquement je pense, vous pouvez utiliser fnDrawCallback()
$('#example').dataTable({
"fnDrawCallback": function(oSettings) {
if ($('#example tr').length < 11) {
$('.dataTables_paginate').hide();
}
}
});
EDIT - une autre façon trouvée ici pourrait être
"fnDrawCallback":function(){
if ( $('#example_paginate span span.paginate_button').size()) {
$('#example_paginate')[0].style.display = "block";
} else {
$('#example_paginate')[0].style.display = "none";
}
}
En S'appuyant sur la réponse de Nicola, vous pouvez utiliser le rappel fnDrawCallback() et l'objet oSettings pour masquer la pagination de la table après qu'elle a été dessinée. Avec oSettings, vous n'avez pas besoin de savoir quoi que ce soit sur les paramètres de la table (enregistrements par page, sélecteurs spécifiques à la table, etc.)
Ce qui suit vérifie si la longueur d'affichage par page est supérieure au total des enregistrements et masque la pagination si elle est:
$('#your_table_selector').dataTable({
"fnDrawCallback": function(oSettings) {
if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay()) {
$(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
}
}
});
Documentation
Voir mon plugin de fonctionnalités conditionalPaging .
Utilisation:
$('#myTable').DataTable({
conditionalPaging: true
});
or
$('#myTable').DataTable({
conditionalPaging: {
style: 'fade',
speed: 500 // optional
}
});
C'est l'approche correcte lorsque vous travaillez dans V1. 10 + de jQuery Datatables. Le processus est généralement le même que dans les versions précédentes, mais les noms d'événements et les méthodes API sont légèrement différents:
$(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);
}
});
Documentation
À l'Aide de @sina suggestion ci-dessus, y compris le correctif mentionné par @GuiSim.
Ajoutez ce code à votre demande d'initialisation datatables.
JQUERY
"fnDrawCallback": function (oSettings) {
var pgr = $(oSettings.nTableWrapper).find('.dataTables_paginate')
if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay()) {
pgr.hide();
} else {
pgr.show()
}
}
Ou mieux encore remplacer
"fnDrawCallback": null
Dans vos datatables.js pour appliquer le code à l'échelle du site.
Je préfère la solution de @ sina. Du bon travail.
Mais mon Un vient avec quelques améliorations nécessaires.
@sina a oublié la partie else
pour afficher à nouveau la pagination si nécessaire. Et j'ai ajouté la possibilité de définir l'option all
dans le lengthMenu
comme suit:
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();
}
}
});
Ce n'est pas directement possible car DataTables ne prend pas en charge l'activation et la désactivation des fonctionnalités sont exécutées. Cependant, ce que vous pouvez faire est d'utiliser la fonction fnDrawCallback() pour vérifier s'il n'y a qu'une seule page, et si c'est le cas, masquer les contrôles de pagination.
Ajoutez simplement ce qui suit à votre feuille de style:
.dataTables_paginate .paginate_button.disabled {
display: none;
}
Vous pouvez également suivre cette voie.
"fnDrawCallback":function(){
if(jQuery('table#table_id td').hasClass('dataTables_empty')){
jQuery('div.dataTables_paginate.paging_full_numbers').hide();
} else {
jQuery('div.dataTables_paginate.paging_full_numbers').show();
}
}
Cela a fonctionné pour moi.
J'ai essayé de rendre sPaginationType aussi dynamique dans datatable pour chaque entrée mais je ne peux pas trouver la solution appropriée pour cela mais ce que j'ai fait était
"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();
}
});
},
$('#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");
}
}
});
JQuery - J'ai essayé avec les options suivantes, cela a fonctionné pour moi
$("#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();
}
}
});
Cette fonction de rappel fonctionne génériquement avec n'importe quel datatable sans avoir à coder en dur l'ID de la table:
$('.data-table').dataTable({
fnDrawCallback: function(oSettings) {
if(oSettings.aoData.length <= oSettings._iDisplayLength){
$(oSettings.nTableWrapper).find('.dataTables_paginate').hide();
}
}
});
Si vos données ne sont pas dynamiques, c'est-à-dire que le serveur génère une table HTML qui est ensuite améliorée par des DataTables, vous pouvez rendre l'option de pagination sur le serveur (j'utilise razor).
$("#results").dataTable({
paging: @(Model.ResultCount > Model.PageSize ? "true" : "false"),
// more ...
});
Je sais que c'est un vieux post, mais pour ceux d'entre nous qui utiliseront ceci, et qui ont un TOC comme moi, un changement est nécessaire.
Modifiez l'instruction if,
if (oSettings._iDisplayLength > oSettings.fnRecordsDisplay())
À
if (oSettings._iDisplayLength >= oSettings.fnRecordsDisplay())
Avec ce petit changement, vous verrez les boutons de pagination pour les longueurs d'enregistrements supérieures à 10, 25, 50, 100 au lieu de présenter les boutons de pagination avec seulement 10 enregistrements, techniquement 10, 25, etc records est toujours une vue d'une page.
Voici ma solution, cela fonctionne aussi si vous avez plusieurs tables sur la même page. Il empêche la colision par exemple (la table a doit avoir une pagination, et B ne doit pas).
TableId dans mon code n'est jamais indéfini. Si vous n'avez pas défini D'ID pour votre table, dataTable le fera pour vous en ajoutant quelque chose comme 'DataTables_Table_0'
fnDrawCallback: function (oSettings) {
if ($(this).DataTable().column(0).data().length <= oSettings._iDisplayLength) {
var tableId = $(this).attr('id');
$('#' + tableId + '_paginate').hide();
}
}
Cela a Résolu mes problèmes:
.dataTables_paginate .disabled {
display:none;
}
dataTables_paginate .disabled + span {
display:none;
}
J'espère que cela vous aidera tous