Сховати / показати стовпець у таблиці HTML


146

У мене 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>

2
Я сподіваюся, що наступний сайт допоможе: fiendish.demon.co.uk/html/javascript/hidetablecols.html

Я реалізував це рішення за допомогою jQuery, і воно прекрасно працювало для мене: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html
Aaron

1
За коментарем користувача344059, ось веб-архів для
недіючого

Відповіді:


84

Я хотів би це зробити, не приєднуючи клас до кожного тд

Особисто я б пішов із підходом клас-на-кожному-td / th / col. Потім ви можете вмикати та вимикати стовпці, використовуючи єдине записування до className на контейнері, припускаючи правила стилю, такі як:

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

Це буде швидше, ніж будь-який підхід до циклу JS; для дійсно довгих таблиць це може суттєво змінити чуйність.

Якщо ви можете уникнути непідтримки IE6, ви можете використовувати селектори суміжності, щоб не додавати атрибути класу до tds. Або, якщо ви турбуєтесь про те, щоб зробити розмітку чистішою, ви можете додати їх із JavaScript автоматично на етапі ініціалізації.


7
Дякую за пораду, я хотів зберегти HTML чистішим, але ефективність, безумовно, стала проблемою, оскільки розмір таблиці наближався до 100 рядків. Це рішення забезпечило покращення продуктивності в 2-5 разів.
Брайан Фішер

2
Такий підхід творив чудеса для мене, ефективні. Дякую!
axelarge

4
Я додав це до свого css .hidden {display:none;}і використав, .addClass('hidden')і .removeClass('hidden')це було трохи швидше, ніж .hide()і .show().
стайф

247

Один рядок коду за допомогою jQuery, який приховує 2-й стовпець:

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

Якщо ваша таблиця має заголовок (го), скористайтеся цим:

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

Джерело: Сховати стовпчик таблиці з єдиним рядком коду jQuery

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


Якщо ви хочете ознайомитися з корисним випадком використання, перегляньте мій пост у блозі:

Сховати стовпчик таблиці та розфарбувати рядки на основі значення за допомогою jQuery .


1
Окрім того, як вони не наведені в прикладі, чи не існує проблеми, що це ігнорує колпанів? Добре, якщо ви їх не використовуєте. Є ще одне питання, пов'язане: stackoverflow.com/questions/1166452/…
Кім R

2
Мені довелося додати tbody до селектора, щоб уникнути приховування нижнього колонтитула з пейджером: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hid ();
Олексій

@KimR Це може допомогти для Colspan питання stackoverflow.com/questions/9623601 / ...
yunzen

Я точно не знаю, чому, але мені довелося скористатися 'n-го типу', щоб змусити його працювати. Наприклад: $ ('table td: nth-of-type (2)'). Hid ();
Леопольдо Санчик

@LeopoldoSanczyk ви використовували Safari? Здається, вона потребує n-го типу
гаразд, зазначає Відновити Моніку

12

ви можете використовувати колекції:

<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>клас бажання .


Я, мабуть, пам’ятаю, що колективна група не підтримує крос-браузер, це більше не відповідає дійсності?
Брайан Фішер

Може бути. Я використовую цей метод для стовпчиків, що знаходяться в темноті (firefox, safari, chrome працює чудово) ніколи не пробував його в IE.
Луїс Мелгратті

@Brian - IE8 не працює, а IE8 з включеною IE7, здається, працює.
Nordes

4
Схоже, це не працює більше в сучасному браузері (Chrome і Firefox)
JBE

@JBE: бути точним, це робить роботу в сучасних браузерах , в деякій мірі . Використовуючи $('table > colgroup > col.yourClassHere')селектор jQuery, ви все одно можете встановити smth, як колір фону усього стовпця, але ви більше не можете перемикати видимість стовпців. Перевіреними браузерами були MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43 . "Більшість атрибутів у HTML 4.01 не підтримуються в HTML5" - дивіться тут .
Бас

11

Це слід зробити:

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

Це неперевірений код, але принцип полягає в тому, що ви вибираєте комірку таблиці у кожному рядку, яка відповідає обраному індексу, витягнутому з імені прапорця. Звичайно, ви можете обмежити селекторів класом або ідентифікатором.


11

Ось трохи детальніше відповідь, яка забезпечує деяку взаємодію користувачів на основі кожного стовпця. Якщо це буде динамічним досвідом, на кожному стовпчику має бути натиснута кнопка, що вказує на можливість приховування стовпця, а потім спосіб відновлення раніше прихованих стовпців.

Це буде виглядати приблизно так у 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, щоб зробити перехід трохи меншим стрибаючий.

Демо скрінграб

Робоча демонстрація у jsFiddle & Stack Snippets:


ви ховаєте найближчий 1 стовпець, як приховати найближчий 3 стовпець?
Nirmal Goswami

перевірити мій стіл - i.stack.imgur.com/AA8iZ.png і питання , який містить таблицю HTML - stackoverflow.com/questions/50838119 / ... кнопка буде після A, B і C
Нірмал Госвамі

Вибачте за відродження такої старої відповіді, але чи є простий спосіб встановлення певних стовпців прихованим за замовчуванням? Я намагаюся це зробити, $(document).readyале не маючи
шансу

1
@RobotJohnny, гарне запитання. Це використовує клас .hide-colдля видалення стовпців, але він також може бути використаний для вказівки стану, так що ви можете також - додавати .hide-colдо кожного td& trпри візуалізації html і робити. Або якщо ви хотіли додати його в меншій кількості, помістіть його в заголовок (цей стан доведеться кудись перейти), а на init використовуйте його, щоб приховати цей індекс стовпця для дітей. В даний час код просто прослуховує позицію при натисканні, але його можна змінити, щоб шукати і позицію класу. Також щасливий день індички
KyleMit

1
@RobotJohnny, я оновив зразок коду, щоб включити обробку ініціалізації. Просто опустіть class='hide-col'куди завгодно у свій html (напевно, це thead > tr > thмає найбільш сенс, і він підбере, щоб переконатися, що він ховає всі комірки в цьому стовпці, а також динамічно показувати колонтитул відновлення
KyleMit

4

І звичайно, 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;}

тощо.


2

Далі будується на коді Ерана з кількома незначними змінами. Протестовано, і, здається, він працює добре на 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

Без класу? Ви можете використовувати тег тоді:

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

І щоб показати їм використання:

...style.display = 'table-cell';            
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.