Ocultar / mostrar coluna em uma tabela HTML

146

Eu tenho uma tabela HTML com várias colunas e preciso implementar um seletor de colunas usando jquery. Quando um usuário clica em uma caixa de seleção, quero ocultar / mostrar a coluna correspondente na tabela. Eu gostaria de fazer isso sem anexar uma classe a cada td da tabela. Existe uma maneira de selecionar uma coluna inteira usando o jquery? Abaixo está um exemplo do 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>
Brian Fisher
fonte
2
Espero que o site a
Eu implementei essa solução usando o jQuery e funcionou perfeitamente para mim: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html
Aaron
1
De acordo com o comentário de user344059, aqui está o arquivo da web para o link quebrado http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html
KyleMit

Respostas:

84

Eu gostaria de fazer isso sem anexar uma classe a cada td

Pessoalmente, eu adotaria a abordagem class-on-each-td / th / col. Em seguida, você pode ativar e desativar as colunas usando uma única gravação em className no contêiner, assumindo regras de estilo como:

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

Isso será mais rápido do que qualquer abordagem de loop JS; para tabelas realmente longas, pode fazer uma diferença significativa na capacidade de resposta.

Se você conseguir se livrar do IE6, poderá usar seletores de adjacência para evitar a necessidade de adicionar os atributos de classe ao tds. Ou, como alternativa, se sua preocupação é tornar a marcação mais limpa, você pode adicioná-las automaticamente do JavaScript em uma etapa de inicialização.

bobince
fonte
7
Obrigado pelo conselho, eu queria manter o HTML mais limpo, mas o desempenho definitivamente se tornou um problema, pois o tamanho da tabela se aproximava de 100 linhas. Essa solução forneceu uma melhoria de desempenho de 2-5x.
23909 Brian Fisher
2
Essa abordagem fez maravilhas para mim, em termos de desempenho. Obrigado!
axelarge
4
Eu adicionei isso ao meu css .hidden {display:none;}e usei .addClass('hidden')e .removeClass('hidden')que era um pouco mais rápido que .hide()e .show().
Styfle
247

Uma linha de código usando jQuery que oculta a 2ª coluna:

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

Se sua tabela tiver cabeçalho (th), use o seguinte:

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

Origem: ocultar uma coluna da tabela com uma única linha de código jQuery

jsFiddle para testar o código: http://jsfiddle.net/mgMem/1/


Se você quiser ver um bom caso de uso, dê uma olhada no meu blog:

Oculte uma coluna da tabela e colore linhas com base no valor com o jQuery .

Leniel Maccaferri
fonte
1
Por um lado, como eles não estão no exemplo, não há um problema que isso ignore colspans? Bom, se você não os estiver usando. Há uma outra questão relacionada: stackoverflow.com/questions/1166452/...
Kim R
2
Eu tive que adicionar o tbody ao seletor para evitar ocultar o rodapé com o pager: $ ('. Webgrid tbody: nth-child (1), .webgrid th: nth-child (1)'). Hide ();
Alex
@KimR Isso pode ajudar em problemas de colspan stackoverflow.com/questions/9623601/…
yunzen
Não sei exatamente o porquê, mas tive que usar o 'enésimo tipo' para fazê-lo funcionar. Por exemplo: $ ('table td: enésimo tipo (2)'). Hide ();
Leopoldo Sanczyk
@LeopoldoSanczyk você estava usando o Safari? Parece que precisa do tipo n do tipo
ykay diz Reinstate Monica
12

você poderia usar 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>

seu script pode mudar apenas a <col>classe desejada .

Luis Melgratti
fonte
Eu me lembro do colgroup não ter suporte para vários navegadores, isso não é mais verdade?
Brian Fisher
Talvez. Eu estou usando esse método para colunas hilight, (firefox, safari, chrome funciona bem) nunca tentei no IE.
Luis Melgratti
@Brian - O IE8 não funciona e o IE8 com o IE7 ativado parece estar funcionando.
Nordes 23/08/10
4
Isso não parece funcionar mais no navegador moderno (Chrome e Firefox)
JBE
@JBE: para ser mais preciso, este faz o trabalho em navegadores modernos , em certa medida . Usando o $('table > colgroup > col.yourClassHere')seletor jQuery, você ainda pode definir smth como a cor de fundo de toda a coluna, mas não poderá mais alternar a visibilidade da coluna. Os navegadores testados foram o MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43 . "A maioria dos atributos no HTML 4.01 não é suportada no HTML5" - veja aqui .
Baixo
11

O seguinte deve fazer isso:

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

Este é um código não testado, mas o princípio é que você escolhe a célula da tabela em cada linha que corresponde ao índice escolhido extraído do nome da caixa de seleção. Obviamente, você pode limitar os seletores com uma classe ou um ID.

Eran Galperin
fonte
11

Aqui está uma resposta um pouco mais completa que fornece alguma interação do usuário por coluna. Se for uma experiência dinâmica, é necessário haver uma alternância clicável em cada coluna que indique a capacidade de ocultar a coluna e, em seguida, uma maneira de restaurar colunas ocultas anteriormente.

Isso seria algo parecido com isto em 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()

})

Para suportar isso, adicionaremos alguma marcação à tabela. Em cada cabeçalho da coluna, podemos adicionar algo assim para fornecer um indicador visual de algo clicável

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

Permitiremos que o usuário restaure colunas por meio de um link no rodapé da tabela. Se não for persistente por padrão, ativá-lo dinamicamente no cabeçalho pode se mover em torno da mesa, mas você pode realmente colocá-lo em qualquer lugar que desejar:

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

Essa é a funcionalidade básica. Aqui está uma demonstração abaixo com mais algumas coisas. Você também pode adicionar uma dica de ferramenta ao botão para ajudar a esclarecer sua finalidade, estilizar o botão um pouco mais organicamente no cabeçalho de uma tabela e reduzir a largura da coluna para adicionar algumas animações css (um pouco estranhas) para tornar a transição um pouco menos nervoso.

Screengrab de demonstração

Demonstração de trabalho em jsFiddle & Stack Snippets:

KyleMit
fonte
você está escondendo a coluna 1 mais próxima, como ocultar a coluna 3 mais próxima?
Nirmal Goswami
veja a minha mesa - i.stack.imgur.com/AA8iZ.png e pergunta que contêm html table - stackoverflow.com/questions/50838119/... botão virão depois de A, B e C
Nirmal Goswami
Desculpe reviver uma resposta tão antiga, mas existe uma maneira fácil de definir determinadas colunas como ocultas por padrão? Eu estou tentando fazê-lo com $(document).readymas tendo nenhuma sorte
RobotJohnny
1
@RobotJohnny, boa pergunta. Isso está usando a classe .hide-colpara remover colunas, mas também pode ser usado para indicar o estado, para que você possa - adicionar .hide-cola cada td& trao renderizar o html e pronto. Ou se você quiser adicioná-lo em menos lugares, coloque-o no cabeçalho (esse estado terá que ir a algum lugar) e, no init, use isso para ocultar esse índice de coluna entre os filhos. Atualmente, o código está apenas ouvindo a posição no clique, mas pode ser modificado para procurar também a posição da classe. Além disso, dia do peru feliz
KyleMit
1
@ RobobJohnny, atualizei o exemplo de código para incluir também o tratamento de inicialização. Basta soltar class='hide-col'qualquer lugar que você quer em sua html (provavelmente em no thead > tr > thfaz mais sentido e vai pegar para ter certeza que esconde todas as células nessa coluna e mostrar dinamicamente rodapé restaurar bem
KyleMit
4

E, claro, o CSS é apenas o caminho para navegadores compatíveis nth-child :

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

Isso é para o IE9 e mais recente.

Para seu caso de usuário, você precisará de várias classes para ocultar as colunas:

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

ect ...

ProblemsOfSumit
fonte
2

O seguinte é baseado no código de Eran, com algumas pequenas alterações. Testei e parece funcionar bem no 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>
Paolo Bergantino
fonte
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>
lahbib
fonte
0

Sem aula? Você pode usar a tag então:

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

E para mostrar a eles, use:

...style.display = 'table-cell';            
Gustavo Ruiz
fonte