web-dev-qa-db-fra.com

désactiver la pagination s'il n'y a qu'une seule page dans les tables de données

J'implémente des balles de données et selon mes besoins, la plupart des choses ont été résolues à l'exception du problème de pagination. Dans mon cas, à chaque fois que la navigation de pagination s'affiche. Je souhaite désactiver la navigation de pagination s'il n'y a qu'une seule page, 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>
54
Bappa

Vous devez les masquer dynamiquement je pense, vous pouvez utiliser fnDrawCallback()

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

EDIT - une autre manière 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";
   }
}
38
Nicola Peluchetti

À partir de la réponse de Nicola, vous pouvez utiliser le rappel fnDrawCallback () et l'objet oSettings pour masquer la pagination de la table une fois qu'elle a été dessinée. Avec oSettings, vous n'avez pas besoin de connaître les paramètres du tableau (enregistrements par page, sélecteurs spécifiques au tableau, etc.)

Les vérifications suivantes permettent de voir si la longueur d'affichage par page est supérieure au nombre total d'enregistrements et de masquer la pagination si elle l'est:

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

Documentation

74
sina

Voir mon plugin de fonctionnalité conditionalPaging .

Usage:

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

or

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

Il s'agit de la bonne approche 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

19
mark.monteiro

Utilisation de @ sina suggestion ci-dessus, y compris le correctif mentionné par @ GuiSim .

Ajoutez ce code à votre demande d'initialisation des tables de données.

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 votre datatables.js pour appliquer le code à l'échelle du site.

4
DreamTeK

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();
        }
    }
});

Vue de sortie DataTable

3
Aravind

Je préfère la solution de @ sina. Bon travail.

Mais le mien 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();
        }
    }
});
3
algorhythm

Cette fonction de rappel fonctionne de manière générique avec n'importe quelle table de données 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();
       }
    }
});
2
Agu Dondo

Je fais le suivi pour atteindre cet objectif, car c'est une solution plus dynamique qui n'est pas exprimée ci-dessus. comme il obtient d'abord le nombre total de pages, puis décidez d'afficher/masquer la pagination. La beauté de ce code n'est que si l'utilisateur change la longueur de la page, il ne sera pas effectué.

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(); 
        }
    }
});
2
Faisal Janjua

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.

1
sreekanth kuriyala
$('#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");
    }

    }
   });
1
Matoeil

J'ai essayé de faire sPaginationType comme dynamique dans datatable pour chaque entrée, mais je ne trouve pas de 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();
        }
    });
},
1
Kamal Kishor

Ajoutez simplement ce qui suit à votre feuille de style:

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

Je sais que c'est un ancien poste, mais pour ceux d'entre nous qui l'utiliseront et auront 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. les enregistrements sont toujours une vue d'une page.

0
Ray

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 DataTables, vous pouvez rendre l'option de pagination sur le serveur (j'utilise un rasoir).

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

Cela a résolu mes problèmes:

.dataTables_paginate .disabled {
   display:none;
}   
dataTables_paginate .disabled + span {
   display:none;
}   

J'espère que cela vous aide à tous

0
Nageshwar Jha

Voici ma solution, cela fonctionne aussi si vous avez plusieurs tableaux 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();
        }
    }
0
Yacine

Ce n'est pas directement possible car DataTables ne prend pas en charge l'activation et la désactivation des fonctionnalités sont au moment de l'exécution. Cependant, vous pouvez 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.

0
Shiven