Ukryj / Pokaż kolumnę w tabeli HTML

Mam tabelę HTML z kilkoma kolumnami i muszę zaimplementować wybór kolumn za pomocą jquery. Gdy użytkownik kliknie na checkbox chcę ukryć / pokazać odpowiednią kolumnę w tabeli. Chciałbym to zrobić bez dołączania klasy do każdego td w tabeli, czy istnieje sposób, aby wybrać całą kolumnę za pomocą jquery? Poniżej znajduje się przykład 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>
Author: Christopher Rapcewicz, 2009-01-19

9 answers

Chciałbym to zrobić bez dołączania klasy do każdego td

Osobiście wybrałbym podejście klasy do każdego td/th / col. Następnie możesz włączać i wyłączać kolumny używając pojedynczego zapisu do nazwy klasy w kontenerze, przyjmując reguły stylu takie jak:
table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...

Będzie to szybsze niż jakakolwiek pętla JS; w przypadku naprawdę długich tabel może to znacząco wpłynąć na responsywność.

Jeśli ujdzie ci to na sucho, że nie wspierasz IE6, możesz użyj selektorów adjacency, aby uniknąć konieczności dodawania atrybutów klasy do tds. Lub alternatywnie, jeśli twoim problemem jest tworzenie znaczników cleaner, możesz dodać je z JavaScript automatycznie w kroku inicjalizacji.

 78
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 14:16:12

Jedna linijka kodu używająca jQuery, która ukrywa drugą kolumnę:

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

Jeśli twoja tabela ma nagłówek (th), użyj tego:

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

Źródło: Ukryj kolumnę tabeli z pojedynczym wierszem kodu jQuery

JsFiddle do przetestowania kodu: http://jsfiddle.net/mgMem/1/


Jeśli chcesz zobaczyć dobry przypadek użycia, spójrz na mój wpis na blogu:

Ukryj kolumnę tabeli i pokoloruj wiersze na podstawie wartości za pomocą jQuery .

 229
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 03:39:36

Możesz użyć 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>

Twój scenariusz może wtedy zmienić tylko pożądanie <col> klasy.

 11
Author: Luis Melgratti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 21:52:20

Powinno to zrobić:

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

Jest to kod nieprzetestowany, ale zasada jest taka, że w każdym wierszu wybiera się komórkę tabeli odpowiadającą wybranemu indeksowi wyodrębnionemu z nazwy pola wyboru. Można oczywiście ograniczyć selektory o klasę lub ID.

 9
Author: Eran Galperin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 22:03:00

I oczywiście tylko CSS dla przeglądarek, które obsługują nth-child:

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

To jest dla IE9 i nowszych.

Dla twojej bazy, potrzebujesz kilku klas, aby ukryć kolumny:

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

Ect...

 3
Author: ProblemsOfSumit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 08:40:10

Oto nieco bardziej w pełni funkcjonalna odpowiedź, która zapewnia pewną interakcję z użytkownikiem na podstawie kolumny. Jeśli ma to być dynamiczne doświadczenie, musi istnieć przełącznik klikalny na każdej kolumnie, który wskazuje możliwość ukrycia kolumny, a następnie sposób przywrócenia wcześniej ukrytych kolumn.

W JavaScript wyglądałoby to mniej więcej tak:

$('.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()

})

Aby to poprzeć, dodamy kilka znaczników do tabeli. W każdym nagłówku kolumny możemy dodać coś takiego aby zapewnić wizualny wskaźnik czegoś klikalnego

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

Pozwolimy użytkownikowi przywrócić kolumny za pomocą linku w stopce tabeli. Jeśli domyślnie nie jest trwały, to włączenie go dynamicznie w nagłówku może poruszać się po tabeli, ale naprawdę możesz umieścić go w dowolnym miejscu:

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

To podstawowa funkcjonalność. Poniżej znajduje się demo z kilkoma dodatkowymi rzeczami. Możesz również dodać podpowiedź do przycisku, aby pomóc wyjaśnić jego cel, styl przycisku trochę bardziej organicznie do nagłówka tabeli i zwiń szerokość kolumny, aby dodać kilka (nieco zawiłych) animacji css, aby przejście było trochę mniej nerwowe.

Demo Screengrab

Praca Demo w jsFiddle & fragmenty stosu:

$(function () {
  $('.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+")")
      .addClass('hide-col'); //.hide()
  })

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

  })
  
  $('[data-toggle="tooltip"]').tooltip({trigger: 'hover'})

})
body {
  padding: 15px;
}
.table-hideable td,
.table-hideable th {
  width: auto;
  transition: width .5s, margin .5s;
}
.btn-condensed.btn-condensed {
  padding: 0 5px;
  box-shadow: none;
}

/* use class to have a little animation */
.hide-col {
    width: 0px !important;
    height: 0px !important;
    display: block !important;
    overflow: hidden !important;
    margin: 0 !important;
    padding: 0 !important;
    border: none !important;
}
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/paper/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
  


<table class="table table-condensed table-hover table-bordered table-striped table-hideable">

  <thead>
    <tr>
      <th>
        Controller
        <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>
      </th>
      <th>
        Action
        <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>
      </th>
      <th>
        Type
        <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>
      </th>
      <th>
        Attributes
        <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>
      </th>
  </thead>
  <tbody>

    <tr>
      <td>Home</td>
      <td>Index</td>
      <td>ActionResult</td>
      <td>Authorize</td>
    </tr>

    <tr>
      <td>Client</td>
      <td>Index</td>
      <td>ActionResult</td>
      <td>Authorize</td>
    </tr>

    <tr>
      <td>Client</td>
      <td>Edit</td>
      <td>ActionResult</td>
      <td>Authorize</td>
    </tr>

  </tbody>
  <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>
</table>
 3
Author: KyleMit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 20:48:38

Poniższy tekst bazuje na kodzie Erana, z kilkoma drobnymi zmianami. Przetestowałem go i wydaje się, że działa dobrze na Firefoksie 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
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 22:15:35
<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>
 1
Author: lahbib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 08:08:16

Bez klasy? Możesz wtedy użyć tagu:

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

I aby je pokazać użyj:

...style.display = 'table-cell';            
 0
Author: Gustavo Ruiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 16:32:44