161 votes

Cacher/afficher une colonne dans un tableau HTML

J'ai un tableau HTML avec plusieurs colonnes et j'ai besoin d'implémenter un sélecteur de colonnes en utilisant jquery. Lorsqu'un utilisateur clique sur une case à cocher, je veux masquer/afficher la colonne correspondante dans le tableau. Je voudrais faire cela sans attacher une classe à chaque td dans le tableau, y a-t-il un moyen de sélectionner une colonne entière en utilisant jquery ? Vous trouverez ci-dessous un exemple de HTML.

<table>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

<form>
    <input type="checkbox" name="col1" checked="checked" /> Hide/Show Column 1 <br />
    <input type="checkbox" name="col2" checked="checked" /> Hide/Show Column 2 <br />
    <input type="checkbox" name="col3" checked="checked" /> Hide/Show Column 3 <br />
</form>

2 votes

J'espère que le site suivant vous aidera : fiendish.demon.co.uk/html/javascript/hidetablecols.html

0 votes

J'ai mis en œuvre cette solution en utilisant jQuery, et elle a parfaitement fonctionné pour moi : http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html

1 votes

Suite au commentaire de l'utilisateur 344059, voici l'archive web pour le lien cassé http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html

268voto

Leniel Macaferi Points 38324

Une ligne de code utilisant jQuery :

$('td:nth-child(2)').hide();

// If your table has header(th), use this:
//$('td:nth-child(2),th:nth-child(2)').hide();

Source : Masquer une colonne de tableau avec une seule ligne de code jQuery

jsFiddle pour tester le code : http://jsfiddle.net/mgMem/1/


Si vous voulez voir un bon cas d'utilisation, jetez un coup d'œil à mon article de blog :

Masquer une colonne de tableau et colorer les rangées en fonction de la valeur avec jQuery .

1 votes

D'ailleurs, comme ils ne sont pas dans l'exemple, n'y a-t-il pas un problème dans le fait que cela ignore les colspans ? C'est une bonne chose si vous ne les utilisez pas. Il y a une autre question connexe : stackoverflow.com/questions/1166452/

2 votes

J'ai dû ajouter le tbody au sélecteur pour éviter de cacher le pied de page avec le pager : $('.webgrid tbody td:nth-child(1), .webgrid th:nth-child(1)').hide() ;

0 votes

@KimR Cela peut aider pour les problèmes de colspan. stackoverflow.com/questions/9623601/

88voto

bobince Points 270740

Je voudrais faire cela sans attacher une classe à chaque td

Personnellement, j'opterais pour l'approche de la classe sur chaque td/th/col. Vous pouvez alors activer et désactiver les colonnes en utilisant une seule écriture vers className sur le conteneur, en supposant que les règles de style soient les suivantes :

table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...

Cette méthode sera plus rapide que toute autre approche de boucle JS ; pour les tableaux vraiment longs, elle peut faire une différence significative en termes de réactivité.

Si vous pouvez vous passer de la prise en charge d'IE6, vous pouvez utiliser des sélecteurs d'adjacence pour éviter d'avoir à ajouter les attributs de classe aux tds. Ou bien, si votre souci est de rendre le balisage plus propre, vous pourriez les ajouter automatiquement à partir de JavaScript dans une étape d'initialisation.

7 votes

Merci pour le conseil, j'ai voulu garder le HTML plus propre, mais les performances sont devenues un problème lorsque la taille de la table approchait les 100 lignes. Cette solution a permis d'améliorer les performances de 2 à 5 fois.

2 votes

Cette approche a fait des merveilles pour moi, en termes de performances. Merci !

4 votes

J'ai ajouté ceci à mon css .hidden {display:none;} et utilisé .addClass('hidden') et .removeClass('hidden') qui était un peu plus rapide que .hide() et .show() .

12voto

Luis Melgratti Points 6297

vous pouvez utiliser des colgroups :

<table>
    <colgroup>
       <col class="visible_class"/>
       <col class="visible_class"/>
       <col class="invisible_class"/>  
    </colgroup>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

votre script pourrait alors changer juste le désir <col> classe.

0 votes

Je crois me souvenir que colgroup n'est pas compatible avec les différents navigateurs, n'est-ce plus le cas ?

0 votes

Peut-être. J'utilise cette méthode pour l'éclairage des colonnes, (firefox, safari, chrome fonctionne bien) je ne l'ai jamais essayé dans IE.

0 votes

@Brian - IE8 ne fonctionne pas et IE8 avec IE7 activé semble fonctionner.

11voto

Eran Galperin Points 49594

Les éléments suivants devraient suffire :

$("input[type='checkbox']").click(function() {
    var index = $(this).attr('name').substr(2);
    $('table tr').each(function() { 
        $('td:eq(' + index + ')',this).toggle();
    });
});

Il s'agit d'un code non testé, mais le principe est que vous choisissez la cellule du tableau dans chaque ligne qui correspond à l'indice choisi extrait du nom de la case à cocher. Vous pourriez bien sûr limiter les sélecteurs avec une classe ou un ID.

5voto

Sumit Points 394

Et bien sûr, la méthode CSS n'existe que pour les navigateurs qui supportent nth-child :

table td:nth-child(2) { display: none; }

Ceci est pour IE9 et mieux.

Pour votre cas d'utilisation, vous auriez besoin de plusieurs classes pour cacher les colonnes :

.hideCol1 td:nth-child(1) { display: none;}
.hideCol2 td:nth-child(2) { display: none;}

ect...

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