Скрыть / показать столбец в таблице HTML

У меня есть таблица HTML с несколькими столбцами, и мне нужно реализовать селектор столбцов с помощью jquery. Когда пользователь устанавливает флажок, я хочу скрыть / показать соответствующий столбец в таблице. Я хотел бы сделать это, не прикрепляя класс к каждому td в таблице, есть ли способ выбрать весь столбец с помощью jquery? Ниже приведен пример 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>

person Brian Fisher    schedule 18.01.2009    source источник
comment
Надеюсь, вам поможет следующий сайт: fiendish.demon.co.uk/ html / javascript / hidetablecols.html   -  person    schedule 18.05.2010
comment
Я реализовал это решение с помощью jQuery, и у меня оно отлично сработало: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html   -  person Aaron    schedule 06.07.2010
comment
Согласно комментарию пользователя 344059, вот веб-архив неработающей ссылки https://web.archive.org/web/20150725122312/http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html.   -  person KyleMit    schedule 11.05.2018


Ответы (8)


Я бы хотел сделать это без привязки класса к каждому td

Лично я бы выбрал подход class-on-each-td / th / col. Затем вы можете включать и выключать столбцы, используя одну запись в className в контейнере, предполагая такие правила стиля, как:

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

Это будет быстрее, чем любой подход с использованием цикла JS; для действительно длинных таблиц это может существенно повлиять на скорость отклика.

Если вы можете обойтись без поддержки IE6, вы можете использовать селекторы смежности, чтобы избежать добавления атрибутов класса в tds. Или, в качестве альтернативы, если вы хотите сделать разметку более чистой, вы можете автоматически добавить их из JavaScript на этапе инициализации.

person bobince    schedule 19.01.2009
comment
Спасибо за совет, я хотел, чтобы HTML был чище, но производительность определенно стала проблемой, поскольку размер таблицы приближался к 100 строкам. Это решение позволило повысить производительность в 2-5 раз. - person Brian Fisher; 23.01.2009
comment
Этот подход творил для меня чудеса с точки зрения производительности. Спасибо! - person axelarge; 02.04.2012
comment
Я добавил это в свой css .hidden {display:none;} и использовал .addClass('hidden') и .removeClass('hidden'), которые были немного быстрее, чем .hide() и .show(). - person styfle; 28.12.2012

Одна строка кода с использованием jQuery, которая скрывает второй столбец:

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

Если в вашей таблице есть заголовок (th), используйте это:

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

Источник: Скрыть столбец таблицы с одним строка кода jQuery

jsFiddle для проверки кода: http://jsfiddle.net/mgMem/1/


Если вы хотите увидеть хороший вариант использования, взгляните на мой пост в блоге:

Скрыть столбец таблицы и раскрасить строки на основе значения с помощью jQuery.

person Leniel Maccaferri    schedule 05.05.2011
comment
Кроме того, поскольку их нет в примере, разве не проблема, что это игнорирует colspans? Хорошо, если вы их не используете. Есть еще один вопрос: stackoverflow.com/questions/1166452/ - person Kim R; 02.11.2011
comment
Мне пришлось добавить tbody к селектору, чтобы не скрывать нижний колонтитул с помощью пейджера: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hide (); - person Alex; 13.01.2012
comment
@KimR Это может помочь при проблемах с colspan stackoverflow.com/questions/9623601/ - person yunzen; 26.09.2012
comment
Я не знаю точно почему, но вместо этого мне пришлось использовать «nth-of-type», чтобы это работало. Например: $ ('table td: nth-of-type (2)'). Hide (); - person Leopoldo Sanczyk; 06.10.2014
comment
@LeopoldoSanczyk вы использовали Safari? Похоже, ему нужен nth-of-type - person ykay says Reinstate Monica; 14.06.2015
comment
@ykay Я забыл упомянуть, что использую Firefox. Судя по дате, 32.0.X или близкая версия. - person Leopoldo Sanczyk; 16.06.2015
comment
@LeopoldoSanczyk Хорошо, я спросил, потому что я только что столкнулся с этим, когда клиент попросил, чтобы его сайт работал над сафари. Возможно, то же самое и для firefox - person ykay says Reinstate Monica; 17.06.2015
comment
Осторожно: при получении индекса с $('.mycol').closest('th').index() вы должны добавить 1, потому что nth-child начинается с 1 !!! так colIdx = $('.mycol').closest('th').index() + 1 - person olidem; 17.10.2018
comment
влияет ли это на каждую таблицу на странице? - person golimar; 30.10.2020
comment
@golimar да ... чтобы ограничить это, вам нужно добавить класс CSS в таблицу, на которую вы хотите настроить таргетинг. Что-то вроде: .my-table-class td:nth-child(2) - person Leniel Maccaferri; 30.10.2020

Вот немного более подробный ответ, который обеспечивает некоторое взаимодействие с пользователем для каждого столбца. Если это будет динамический опыт, в каждом столбце должен быть активный переключатель, который указывает на возможность скрытия столбца, а затем способ восстановления ранее скрытых столбцов.

В 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()

})

Чтобы поддержать это, мы добавим в таблицу разметку. В заголовок каждого столбца мы можем добавить что-то вроде этого, чтобы обеспечить визуальный индикатор чего-то кликабельного.

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

Мы позволим пользователю восстанавливать столбцы по ссылке в нижнем колонтитуле таблицы. Если он не является постоянным по умолчанию, то его динамическое включение в заголовке может толкать вокруг стола, но вы действительно можете поместить его куда угодно:

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

Это базовая функциональность. Вот демонстрация ниже, в которой раскрыто еще несколько вещей. Вы также можете добавить всплывающую подсказку к кнопке, чтобы прояснить ее назначение, придать кнопке более органичный стиль в заголовке таблицы и свернуть ширину столбца, чтобы добавить некоторые (несколько шаткие) анимации css, чтобы сделать переход немного меньше нервный.

Demo Screengrab

Рабочая демонстрация в jsFiddle и фрагменты стека:

$(function() {
  // on init
  $(".table-hideable .hide-col").each(HideColumnIndex);

  // on click
  $('.hide-column').click(HideColumnIndex)

  function HideColumnIndex() {
    var $el = $(this);
    var $cell = $el.closest('th,td')
    var $table = $cell.closest('table')

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

    // find and hide col index
    $table.find("tbody tr, thead tr")
      .children(":nth-child(" + colIndex + ")")
      .addClass('hide-col');
      
    // show restore footer
    $table.find(".footer-restore-columns").show()
  }

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

  })

  $('[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 class="hide-col">
        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="footer-restore-columns">
    <tr>
      <th colspan="4"><a class="restore-columns" href="#">Some columns hidden - click to show all</a></th>
    </tr>
  </tfoot>
</table>

person KyleMit    schedule 23.01.2018
comment
вы скрываете ближайший 1 столбец, как скрыть ближайшие 3 столбца? - person Nirmal Goswami; 15.06.2018
comment
проверьте мою таблицу - i.stack.imgur.com/AA8iZ.png и задайте вопрос, какой содержат таблицу html - Кнопка stackoverflow.com/questions/50838119/ появится после A, B и C - person Nirmal Goswami; 15.06.2018
comment
извините, что возродил такой старый ответ, но есть ли простой способ скрыть определенные столбцы по умолчанию? Я пытаюсь сделать это с $(document).ready, но мне не повезло - person RobotJohnny; 22.11.2018
comment
@RobotJohnny, хороший вопрос. Здесь используется класс .hide-col для удаления столбцов, но он также может использоваться для обозначения состояния, так что вы можете либо - добавить .hide-col к каждому td & tr при рендеринге html и готово. Или, если вы хотите добавить его в меньшее количество мест, поместите его в заголовок (это состояние должно быть куда-то) и при инициализации используйте это, чтобы скрыть этот индекс столбца для дочерних элементов. В настоящее время код просто прослушивает позицию при щелчке, но его также можно изменить для поиска позиции класса. Также счастливого дня индейки - person KyleMit; 22.11.2018
comment
@RobotJohnny, я обновил пример кода, включив в него также обработку инициализации. Просто перетащите class='hide-col' в любом месте вашего html (вероятно, в thead > tr > th имеет наибольший смысл, и он подберет, чтобы убедиться, что он скрывает все ячейки в этом столбце, а также динамически отображает нижний колонтитул восстановления. - person KyleMit; 23.11.2018
comment
Как сохранить фиксированную ширину столбца, если какой-либо столбец скрыт? - person sjain; 05.04.2019
comment
@sjain, таблица в демонстрации имеет ширину 100%, поэтому, когда столбцы удалены, остальные будут занимать это пространство. Один из способов - не заполнять таблицы на 100% ширины, и тогда каждый из столбцов будет иметь независимый размер и сохранять свою ширину независимо от того, какие из них видны. Вот пример такого подхода в jsFiddle. - person KyleMit; 05.04.2019

вы можете использовать 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>

тогда ваш скрипт может просто изменить свой <col> класс.

person Luis Melgratti    schedule 18.01.2009
comment
Кажется, я помню, что у colgroup не было кроссбраузерной поддержки, это уже не так? - person Brian Fisher; 19.01.2009
comment
Может быть. Я использую этот метод для столбцов hilight (firefox, safari, chrome отлично работает) никогда не пробовал его в IE. - person Luis Melgratti; 19.01.2009
comment
@Brian - IE8 не работает, а IE8 с включенным IE7, похоже, работает. - person Nordes; 23.08.2010
comment
Кажется, это больше не работает в современном браузере (Chrome и Firefox). - person JBE; 28.02.2013
comment
@JBE: если быть точным, это действительно работает в современных браузерах до некоторой степени. Используя селектор $('table > colgroup > col.yourClassHere') jQuery, вы по-прежнему можете установить что-то вроде цвета фона всего столбца, но вы больше не можете переключать видимость столбца. Протестированные браузеры: MSIE 11, Safari 5, Chromium 44, Opera 12, Mozilla SeaMonkey 2.40 < / b>, Mozilla Firefox 43. Большинство атрибутов в HTML 4.01 не поддерживаются в HTML5 - см. здесь. - person Bass; 28.04.2016

Следующее должно сделать это:

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

Это непроверенный код, но принцип заключается в том, что вы выбираете ячейку таблицы в каждой строке, которая соответствует выбранному индексу, извлеченному из имени флажка. Конечно, вы можете ограничить селекторы классом или идентификатором.

person Eran Galperin    schedule 18.01.2009

И, конечно же, CSS - единственный способ для браузеров, поддерживающих nth-child:

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

Это для IE9 и новее.

Для вашего варианта использования вам понадобится несколько классов, чтобы скрыть столбцы:

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

ect ...

person ProblemsOfSumit    schedule 18.05.2014

Следующее строится на коде Эрана с небольшими изменениями. Протестировал, и, похоже, он отлично работает в 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>
person Paolo Bergantino    schedule 18.01.2009

Без класса? Тогда вы можете использовать тег:

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

И чтобы показать им использование:

...style.display = 'table-cell';            
person Gustavo Ruiz    schedule 13.08.2013