105 votes

jQuery DataTables : contrôle de la largeur des tableaux

J'ai un problème pour contrôler la largeur d'un tableau à l'aide du plugin jQuery DataTables. Le tableau est censé avoir une largeur égale à 100 % de celle du conteneur, mais il finit par avoir une largeur arbitraire, plutôt inférieure à celle du conteneur.

Suggestions appréciées

La déclaration de la table ressemble à ceci

<table id="querytableDatasets" class="display" cellspacing="0"
cellpadding="3"     width="100%">

Et le javascript

jQuery('#tab-datasets').load('/cgi-bin/qryDatasets', '', function (){  
    jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false  
    });  
});  `  

En inspectant le HTML dans Firebug, on voit ceci (notez l'ajout de style="width : 0px ;")

<table id="querytableDatasets" class="display" cellspacing="0" 
cellpadding="3" width="100%" style="width: 0px;">

En regardant les styles dans Firebug, le style table.display a été remplacé. Je ne vois pas d'où cela vient.

element.style {  
  width:0;}    

-- dataTables.css (line 84
table.display { 
  margin:0 auto;  
  width:100%;  
}

0 votes

Pour votre information, je viens de rencontrer un problème où une colonne ne s'ajustait pas correctement dans IE8. Le coupable était une image qui avait l'extension max-width définie. Apparemment, IE8 n'aime pas trop cette propriété et l'a ignorée en ce qui concerne les tables de données, même si la taille de l'image était correcte à l'écran. En la changeant en width a réglé le problème.

63voto

Suraj Points 169
jQuery('#querytableDatasets').dataTable({  
        "bAutoWidth": false
});

2 votes

C'était la bonne réponse pour moi. J'utilise boostrap .table-responsive. Avec le code de la table de données qui définit sa propre largeur, cela me gêne.

0 votes

Je suis venu ici pour poster ma solution à ce problème stupide qui impliquait la suppression de la propriété width sur l'événement de changement d'onglet, mais cela semble avoir réglé le problème. Merci. +1

0 votes

J'ai 3 onglets et des tables de données sur les deux premiers onglets, la table sur le deuxième onglet n'était pas en pleine largeur. ceci a réglé mon problème. merci.

61voto

Arik Kfir Points 466

Le problème est dû au fait que dataTable doit calculer sa largeur - mais lorsqu'il est utilisé à l'intérieur d'un onglet, il n'est pas visible et ne peut donc pas calculer les largeurs. La solution consiste à appeler 'fnAdjustColumnSizing' lorsque l'onglet s'affiche.

Préambule

Cet exemple montre comment les DataTables avec défilement peuvent être utilisés conjointement avec des onglets jQuery UI (ou toute autre méthode par laquelle le tableau se trouve dans un élément caché (display:none) lorsqu'il est initialisé). La raison pour laquelle raison pour laquelle cela nécessite une attention particulière, est que lorsque DataTables est est initialisée et qu'elle se trouve dans un élément caché, le navigateur n'a pas n'a pas de mesures à donner à DataTables, ce qui va nécessiter un mauvais alignement des colonnes. dans le désalignement des colonnes lorsque le défilement est activé.

La méthode pour contourner ce problème consiste à appeler la fonction API fnAdjustColumnSizing de l'API. Cette fonction calcule les largeurs de colonne nécessaires en fonction des données actuelles. nécessaire en fonction des données actuelles, puis redessine le tableau, ce qui est exactement ce qui est exactement ce qui est nécessaire lorsque le tableau devient visible pour la première fois. Pour cela, nous utilisons la méthode "show" fournie par les tableaux jQuery UI. Nous vérifions si le DataTable a été créé ou non (notez le sélecteur supplémentaire pour 'div.data'). sélecteur supplémentaire pour 'div.dataTables_scrollBody', qui est ajouté lors de l'initialisation de la DataTable. DataTable est initialisée). Si la table a été initialisée, nous la redimensionner. Une optimisation pourrait être ajoutée pour redimensionner uniquement la premier affichage de la table.

Code d'initialisation

$(document).ready(function() {
    $("#tabs").tabs( {
        "show": function(event, ui) {
            var oTable = $('div.dataTables_scrollBody>table.display', ui.panel).dataTable();
            if ( oTable.length > 0 ) {
                oTable.fnAdjustColumnSizing();
            }
        }
    } );

    $('table.display').dataTable( {
        "sScrollY": "200px",
        "bScrollCollapse": true,
        "bPaginate": false,
        "bJQueryUI": true,
        "aoColumnDefs": [
            { "sWidth": "10%", "aTargets": [ -1 ] }
        ]
    } );
} );

Voir ce pour plus d'informations.

1 votes

J'ai également le même problème que @John McC, mais j'ai appliqué ma table de données à une modale, j'utilise bootstrap et je suis coincé avec ce problème. Savez-vous comment l'implémenter en utilisant la modale de bootstrap au lieu des onglets ?

0 votes

Je recommande d'utiliser window.resize Regardez un exemple legacy.datatables.net/ref#fnAdjustColumnSizing

0 votes

"aoColumnDefs" : [{ "sWidth" : "10%", "aTargets" : [ -1 ] }]. Je règle mon problème en ajoutant simplement ceci, merci.

55voto

artlung Points 13433

Vous voudrez modifier deux variables lorsque vous initialiserez dataTables : bAutoWidth et aoColumns.sWidth

En supposant que vous avez 4 colonnes avec des largeurs de 50px, 100, 120px et 30px, vous ferez ce qui suit :

jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false,
        "bAutoWidth": false,
        "aoColumns" : [
            { sWidth: '50px' },
            { sWidth: '100px' },
            { sWidth: '120px' },
            { sWidth: '30px' }
        ]  
    }); 

Vous trouverez plus d'informations sur l'initialisation des dataTables à l'adresse suivante http://datatables.net/usage

Observez l'interaction entre ce paramètre des widhts et le CSS que vous appliquez. Vous pouvez commenter votre CSS existant avant de l'essayer pour voir si vous obtenez des résultats similaires.

0 votes

Mmm. ce que vous dites, c'est que c'est le résultat de bAutoWidth:true qui ne fait pas des choix particulièrement intelligents pour la largeur des colonnes.

0 votes

Voici ce que je pense. Mes tableaux rebondissent si les données sont de longueur inégale. C'est pourquoi j'ai introduit les paramètres aoColumns et bAutoWidth.

1 votes

Magnifique. J'ai totalement résolu mon problème.

48voto

IfLoop Points 59461

Eh bien, je ne suis pas familier avec ce plugin, mais pourriez-vous réinitialiser le style après avoir ajouté la table de données ? Quelque chose comme

$("#querydatatablesets").css("width","100%")

après l'appel .dataTable ?

1 votes

J'ai trouvé que c'était également la meilleure solution, car dans mon cas, le tableau était également réglé sur une largeur de 100px lorsque l'une des colonnes était rendue invisible - voir ici : datatables.net/forums/discussion/3417/

0 votes

C'est la solution qui a fonctionné pour moi. Elle donne un contrôle plus fin sur le css du tableau de données par rapport à la solution oTable.fnAdjustColumnSizing() ; mentionnée précédemment.

6voto

cure85 Points 11

Vous devez laisser au moins un champ sans champ fixe, par exemple :

$('.data-table').dataTable ({

 "bAutoWidth": false,
 "aoColumns" : [
    null,
    null,
    null,                    
    null,
    {"sWidth": "20px"},
    { "sWidth": "20px"}]
});

Vous pouvez les changer tous, mais ne laisser qu'un seul comme null, pour qu'il puisse s'étirer. Si vous mettez des largeurs sur TOUS, cela ne fonctionnera pas. J'espère avoir aidé quelqu'un aujourd'hui !

1 votes

C'était ça pour moi, je réglais toutes les colonnes à 1px. C'est en enlevant une colonne que ça a marché comme par magie. Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X