Nascondi / Mostra colonna in una tabella HTML


146

Ho una tabella HTML con diverse colonne e ho bisogno di implementare un selettore di colonne usando jquery. Quando un utente fa clic su una casella di controllo, voglio nascondere / mostrare la colonna corrispondente nella tabella. Vorrei farlo senza associare una classe a ogni td nella tabella, c'è un modo per selezionare un'intera colonna usando jquery? Di seguito è riportato un esempio dell'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
Spero che il sito folowing aiuterebbe: fiendish.demon.co.uk/html/javascript/hidetablecols.html

Ho implementato questa soluzione usando jQuery e ha funzionato perfettamente per me: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html
Aaron,

1
Per il commento di user344059, ecco l'archivio web per il link non funzionante http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html
KyleMit

Risposte:


84

Vorrei farlo senza associare una classe a ogni td

Personalmente, seguirei l'approccio class-on-each-td / th / col. Quindi puoi attivare e disattivare le colonne utilizzando una singola scrittura su className sul contenitore, assumendo regole di stile come:

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

Questo sarà più veloce di qualsiasi approccio loop JS; per tavoli molto lunghi può fare una differenza significativa in termini di reattività.

Se riesci a cavartela senza supportare IE6, puoi usare i selettori di adiacenza per evitare di dover aggiungere gli attributi di classe a tds. In alternativa, se la tua preoccupazione è rendere il markup più pulito, potresti aggiungerli automaticamente da JavaScript in una fase di inizializzazione.


7
Grazie per il consiglio, avrei voluto mantenere l'HTML più pulito, ma le prestazioni sono diventate sicuramente un problema quando le dimensioni della tabella si sono avvicinate a 100 righe. Questa soluzione ha fornito un miglioramento delle prestazioni 2-5x.
Brian Fisher,

2
Questo approccio ha funzionato a meraviglia, per quanto riguarda le prestazioni. Grazie!
axelarge

4
Ho aggiunto questo al mio CSS .hidden {display:none;}e usato .addClass('hidden')e .removeClass('hidden')che era un po 'più veloce di .hide()e .show().
Styfle,

247

Una riga di codice usando jQuery che nasconde la seconda colonna:

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

Se la tua tabella ha un'intestazione (th), usa questo:

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

Origine: nasconde una colonna della tabella con una singola riga di codice jQuery

jsFiddle per testare il codice: http://jsfiddle.net/mgMem/1/


Se vuoi vedere un buon caso d'uso, dai un'occhiata al mio post sul blog:

Nascondi una colonna della tabella e colora le righe in base al valore con jQuery .


1
A parte il fatto che non sono nell'esempio, non c'è un problema che questo ignora Colspan? Buono se non li stai usando però. C'è un'altra domanda relativa: stackoverflow.com/questions/1166452/…
Kim R

2
Ho dovuto aggiungere il corpo al selettore per evitare di nascondere il piè di pagina con il cercapersone: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hide ();
Alex

@KimR Questo può aiutare per le questioni colspan stackoverflow.com/questions/9623601/...
yunzen

Non so esattamente perché, ma invece ho dovuto usare 'nth-of-type' per farlo funzionare. Ad esempio: $ ('table td: nth-of-type (2)'). Hide ();
Leopoldo Sanczyk,

@LeopoldoSanczyk stavi usando Safari? Sembra che abbia bisogno di un nth-of-type
ykay dice Reinstate Monica il

12

potresti usare i colgroup:

<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>

la tua sceneggiatura potrebbe cambiare solo la <col>classe del desiderio .


Mi sembra di ricordare che colgroup che non ha il supporto per più browser non è più vero?
Brian Fisher,

Può essere. sto usando questo metodo per colonne hilight, (Firefox, Safari, Chrome funziona bene) mai provato in IE.
Luis Melgratti,

@Brian - IE8 non funziona e IE8 con IE7 abilitato sembra funzionare.
Nordes,

4
Questo sembra non funzionare più nel browser moderno (Chrome e Firefox)
JBE,

@JBE: per la precisione, questo fa il lavoro nei browser moderni in una certa misura . Usando il $('table > colgroup > col.yourClassHere')selettore jQuery, puoi comunque impostare smth come il colore di sfondo dell'intera colonna, ma non puoi più attivare / disattivare la visibilità della colonna. I browser testati erano MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43 . "La maggior parte degli attributi in HTML 4.01 non sono supportati in HTML5" - vedi qui .
Bass

11

Quanto segue dovrebbe farlo:

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

Questo è un codice non testato, ma il principio è che si sceglie la cella della tabella in ogni riga che corrisponde all'indice scelto estratto dal nome della casella di controllo. Ovviamente potresti limitare i selettori con una classe o un ID.


11

Ecco una risposta un po 'più completa che fornisce alcune interazioni dell'utente su base per colonna. Se si tratterà di un'esperienza dinamica, è necessario attivare / disattivare un clic su ogni colonna per indicare la possibilità di nascondere la colonna e quindi un modo per ripristinare colonne precedentemente nascoste.

Sarebbe simile a questo in JavaScript:

$('.hide-column').click(function(e){
  var $btn = $(this);
  var $cell = $btn.closest('th,td')
  var $table = $btn.closest('table')

  // get cell location - https://stackoverflow.com/a/4999018/1366033
  var cellIndex = $cell[0].cellIndex + 1;

  $table.find(".show-column-footer").show()
  $table.find("tbody tr, thead tr")
        .children(":nth-child("+cellIndex+")")
        .hide()
})

$(".show-column-footer").click(function(e) {
    var $table = $(this).closest('table')
    $table.find(".show-column-footer").hide()
    $table.find("th, td").show()

})

A supporto di ciò, aggiungeremo un po 'di markup alla tabella. In ogni intestazione di colonna, possiamo aggiungere qualcosa del genere per fornire un indicatore visivo di qualcosa su cui è possibile fare clic

<button class="pull-right btn btn-default btn-condensed hide-column" 
            data-toggle="tooltip" data-placement="bottom" title="Hide Column">
    <i class="fa fa-eye-slash"></i>  
</button>

Consentiremo all'utente di ripristinare le colonne tramite un collegamento nel piè di pagina della tabella. Se non è persistente per impostazione predefinita, attivarlo dinamicamente nell'intestazione potrebbe spostarsi attorno al tavolo, ma puoi davvero inserirlo ovunque tu voglia:

<tfoot class="show-column-footer">
   <tr>
    <th colspan="4"><a class="show-column" href="#">Some columns hidden - click to show all</a></th>
  </tr>
</tfoot>

Questa è la funzionalità di base. Ecco una demo di seguito con un paio di cose in più. Puoi anche aggiungere una descrizione comando al pulsante per chiarire il suo scopo, dare uno stile un po 'più organico all'intestazione di una tabella e comprimere la larghezza della colonna per aggiungere alcune animazioni css (un po' traballanti) per rendere la transizione un po 'meno jumpy.

Demo Screengrab

Demo di lavoro in jsFlack & Stack Snippet:


stai nascondendo la colonna 1 più vicina, come nascondere la colonna 3 più vicina?
Nirmal Goswami,

controlla la mia tabella - i.stack.imgur.com/AA8iZ.png e la domanda che contiene la tabella html - stackoverflow.com/questions/50838119/… verrà dopo il pulsante A, B e C
Nirmal Goswami,

mi dispiace rivivere una risposta così vecchia, ma esiste un modo semplice per impostare alcune colonne come nascoste per impostazione predefinita? Sto provando a farlo con $(document).readyma senza fortuna
RobotJohnny il

1
@RobotJohnny, bella domanda. Questo sta usando la classe .hide-colper rimuovere le colonne, ma può anche essere usato per indicare anche lo stato, quindi è possibile - aggiungere .hide-cola ciascuno tde trquando si esegue il rendering dell'html ed essere fatto. O se vuoi aggiungerlo in meno punti, mettilo nell'intestazione (quello stato dovrà andare da qualche parte), e su init, usalo per nascondere quell'indice di colonna tra i bambini. Attualmente, il codice sta solo ascoltando la posizione al clic, ma potrebbe essere modificato per cercare anche la posizione della classe. Inoltre, buona giornata della Turchia
KyleMit,

1
@RobotJohnny, ho aggiornato l'esempio di codice per includere anche la gestione dell'inizializzazione. Rilascia semplicemente class='hide-col'dove vuoi nel tuo html (probabilmente nel thead > tr > thpiù sensato e riprenderà per assicurarsi che nasconda tutte le celle in quella colonna e mostri dinamicamente anche il piè di pagina di ripristino
KyleMit

4

E, naturalmente, il CSS è l'unico modo per i browser che supportano nth-child :

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

Questo è per IE9 e successivi.

Per il tuo caso d'uso, avresti bisogno di diverse classi per nascondere le colonne:

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

ect ...


2

Quanto segue si basa sul codice di Eran, con alcune piccole modifiche. Provato e sembra funzionare bene su Firefox 3, IE7.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<script>
$(document).ready(function() {
    $('input[type="checkbox"]').click(function() {
        var index = $(this).attr('name').substr(3);
        index--;
        $('table tr').each(function() { 
            $('td:eq(' + index + ')',this).toggle();
        });
        $('th.' + $(this).attr('name')).toggle();
    });
});
</script>
<body>
<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>
</body>
</html>

1
<p><input type="checkbox" name="ch1" checked="checked" /> First Name</p>
.... 
<td class="ch1">...</td>

 <script>
       $(document).ready(function() {
            $('#demo').multiselect();
        });


        $("input:checkbox:not(:checked)").each(function() {
    var column = "table ." + $(this).attr("name");
    $(column).hide();
});

$("input:checkbox").click(function(){
    var column = "table ." + $(this).attr("name");
    $(column).toggle();
});
 </script>

0

Senza lezione? È possibile utilizzare il tag quindi:

var tds = document.getElementsByTagName('TD'),i;
for (i in tds) {
  tds[i].style.display = 'none';
}

E per mostrarli usa:

...style.display = 'table-cell';            
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.