Ocultar / Mostrar columna en una tabla HTML

146

Tengo una tabla HTML con varias columnas y necesito implementar un selector de columnas usando jquery. Cuando un usuario hace clic en una casilla de verificación, quiero ocultar / mostrar la columna correspondiente en la tabla. Me gustaría hacer esto sin adjuntar una clase a cada td en la tabla, ¿hay alguna manera de seleccionar una columna completa usando jquery? A continuación se muestra un ejemplo del 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
fuente
2
Espero que el siguiente sitio ayude: fiendish.demon.co.uk/html/javascript/hidetablecols.html
Implementé esta solución usando jQuery, y funcionó perfectamente para mí: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html
Aaron
1
Según el comentario del usuario 344059, aquí está el archivo web del enlace roto http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html
KyleMit

Respuestas:

84

Me gustaría hacer esto sin adjuntar una clase a cada td

Personalmente, iría con el enfoque class-on-each-td / th / col. Luego puede activar y desactivar columnas usando una sola escritura en className en el contenedor, asumiendo reglas de estilo como:

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

Esto va a ser más rápido que cualquier enfoque de bucle JS; para tablas realmente largas puede marcar una diferencia significativa en la capacidad de respuesta.

Si puede salirse con la suya sin admitir IE6, podría usar selectores de adyacencia para evitar tener que agregar los atributos de clase a tds. O, alternativamente, si su preocupación es hacer que el marcado sea más limpio, puede agregarlos desde JavaScript automáticamente en un paso de inicialización.

bobince
fuente
77
Gracias por el consejo, quería mantener el HTML limpio, pero el rendimiento definitivamente se convirtió en un problema ya que el tamaño de la tabla se acercaba a las 100 filas. Esta solución, proporcionó una mejora de rendimiento 2-5x.
Brian Fisher
2
Este enfoque funcionó de maravilla para mí, en cuanto al rendimiento. ¡Gracias!
axelarge 01 de
44
Agregué esto a mi CSS .hidden {display:none;}y usé .addClass('hidden')y .removeClass('hidden')que fue un poco más rápido que .hide()y .show().
styfle
247

Una línea de código usando jQuery que oculta la segunda columna:

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

Si su tabla tiene encabezado (th), use esto:

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

Fuente: Ocultar una columna de tabla con una sola línea de código jQuery

jsFiddle para probar el código: http://jsfiddle.net/mgMem/1/


Si quieres ver un buen caso de uso, mira mi publicación de blog:

Ocultar una columna de tabla y colorear las filas según el valor con jQuery .

Leniel Maccaferri
fuente
1
Además, como no están en el ejemplo, ¿no hay un problema que ignore los colspans? Sin embargo, es bueno si no los estás usando. Hay otra pregunta relacionada: stackoverflow.com/questions/1166452/…
Kim R
2
Tuve que agregar el tbody al selector para evitar ocultar el pie de página con el localizador: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hide ();
Alex
@KimR Esto puede ayudar para problemas de colspan stackoverflow.com/questions/9623601/…
yunzen
No sé exactamente por qué, pero tuve que usar 'nth-of-type' en su lugar, para que funcione. Por ejemplo: $ ('table td: nth-of-type (2)'). Hide ();
Leopoldo Sanczyk
@LeopoldoSanczyk ¿estabas usando Safari? Parece que necesita un enésimo tipo
ykay dice Reinstate Monica
12

podrías 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>

su guión podría cambiar solo la <col>clase de deseo .

Luis Melgratti
fuente
Me parece recordar que colgroup no tiene soporte para varios navegadores, ¿eso ya no es cierto?
Brian Fisher
Tal vez. Estoy usando este método para columnas hilight (firefox, safari, chrome funciona bien) nunca lo probé en IE.
Luis Melgratti
@Brian: IE8 no funciona e IE8 con IE7 habilitado parece estar funcionando.
Nordes
44
Parece que esto ya no funciona en el navegador moderno (Chrome y Firefox)
JBE
@JBE: para ser más precisos, esto hace el trabajo en los navegadores modernos , en cierta medida . Usando el $('table > colgroup > col.yourClassHere')selector jQuery, aún puede configurar algo como el color de fondo de toda la columna, pero ya no puede alternar la visibilidad de la columna. Los navegadores probados fueron MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43 . "La mayoría de los atributos en HTML 4.01 no son compatibles con HTML5" - vea aquí .
Bajo
11

Lo siguiente debería hacerlo:

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

Este es un código no probado, pero el principio es que elige la celda de la tabla en cada fila que corresponde al índice elegido extraído del nombre de la casilla de verificación. Por supuesto, podría limitar los selectores con una clase o una ID.

Eran Galperin
fuente
11

Aquí hay una respuesta un poco más completa que proporciona cierta interacción del usuario por columna. Si esto va a ser una experiencia dinámica, debe haber un botón de clic en cada columna que indique la capacidad de ocultar la columna, y luego una forma de restaurar columnas previamente ocultas.

Se vería así en 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 respaldar esto, agregaremos algunas marcas a la tabla. En cada encabezado de columna, podemos agregar algo como esto para proporcionar un indicador visual de algo en el que se pueda hacer 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>

Permitiremos al usuario restaurar columnas a través de un enlace en el pie de página de la tabla. Si no es persistente de forma predeterminada, entonces activarlo dinámicamente en el encabezado podría moverse alrededor de la mesa, pero realmente puede colocarlo en cualquier lugar que desee:

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

Esa es la funcionalidad básica. Aquí hay una demostración a continuación con un par de cosas más desarrolladas. También puede agregar una información sobre herramientas al botón para ayudar a aclarar su propósito, diseñar el botón un poco más orgánicamente en el encabezado de una tabla y contraer el ancho de la columna para agregar algunas animaciones CSS (algo inestables) para hacer la transición un poco menos asustadizo.

Captura de pantalla de demostración

Demostración de trabajo en jsFiddle & Stack Snippets:

KyleMit
fuente
estás escondiendo la 1 columna más cercana, ¿cómo ocultar la 3 columna más cercana?
Nirmal Goswami
revise mi tabla: i.stack.imgur.com/AA8iZ.png y la pregunta que contiene la tabla html: el botón stackoverflow.com/questions/50838119/… aparecerá después de A, B y C
Nirmal Goswami
lamento revivir una respuesta tan antigua, pero ¿hay alguna manera fácil de configurar ciertas columnas como ocultas de forma predeterminada? Estoy tratando de hacerlo $(document).readypero no tengo suerte
RobotJohnny
1
@RobotJohnny, buena pregunta. Esto está usando la clase .hide-colpara eliminar columnas, pero también se puede usar para indicar el estado, por lo que podría: agregar .hide-cola cada td& tral representar el html y listo. O si desea agregarlo en menos lugares, póngalo en el encabezado (ese estado tendrá que ir a algún lado), y en init, úselo para ocultar ese índice de columna en los elementos secundarios. Actualmente, el código solo está escuchando la posición al hacer clic, pero también podría modificarse para buscar la posición de la clase. Además, feliz día de Turquía
KyleMit
1
@RobotJohnny, actualicé el ejemplo de código para incluir también el manejo de inicialización. Simplemente suelte el class='hide-col'lugar que desee en su html (probablemente en el thead > tr > thsentido más lógico y se recuperará para asegurarse de que oculta todas las celdas en esa columna y también muestra dinámicamente el pie de página de restauración)
KyleMit
4

Y, por supuesto, la única forma de CSS para los navegadores que admiten nth-child :

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

Esto es para IE9 y más reciente.

Para su caso de uso, necesitaría varias clases para ocultar las columnas:

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

ect ...

Problemas de Sumum
fuente
2

Lo siguiente se basa en el código de Eran, con algunos cambios menores. Lo probé y parece funcionar bien en 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
fuente
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
fuente
0

Sin clase? Puede usar la etiqueta entonces:

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

Y para mostrarles use:

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