Удалить / скрыть пустые столбцы таблицы, включая <th>

Как я могу скрыть столбец со всеми пустыми ячейками, включая заголовок <th> в этом столбце, оставляя остальные столбцы и их названия, как есть. Следующее jquery скрывает весь <th>чего не хочу. Вот пример, где я хочу скрыть только весь столбец 3, включая <th>, Спасибо заранее.

$('table#mytable tr').each(function() {
    if ($(this).children('td:empty').length === $(this).children('td').length) {
        $(this).hide();
    }
});

6 ответов

Решение

Потребовалось время, чтобы собраться вместе. Спасибо nxt за часть кода.

$('#mytable th').each(function(i) {
    var remove = 0;

    var tds = $(this).parents('table').find('tr td:nth-child(' + (i + 1) + ')')
    tds.each(function(j) { if (this.innerHTML == '') remove++; });

    if (remove == ($('#mytable tr').length - 1)) {
        $(this).hide();
        tds.hide();
    }
});

Если вы хотите скрыть столбец, если все ячейки (без заголовка) пусты, вы можете сделать что-то вроде:

$('#mytable tr th').each(function(i) {
     //select all tds in this column
     var tds = $(this).parents('table')
              .find('tr td:nth-child(' + (i + 1) + ')');
        //check if all the cells in this column are empty
        if(tds.length == tds.filter(':empty').length) { 
            //hide header
            $(this).hide();
            //hide cells
            tds.hide();
        } 
}); 

Пример: http://jsfiddle.net/DeQHs/

Пример 2 (адаптирован для jQuery> 1.7): http://jsfiddle.net/mkginfo/mhgtmc05/

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

    $('table').each(function(a, tbl) {
        var currentTableRows = $(tbl).find('tbody tr').length;
        $(tbl).find('th').each(function(i) {
            var remove = 0;
            var currentTable = $(this).parents('table');

            var tds = currentTable.find('tr td:nth-child(' + (i + 1) + ')');
            tds.each(function(j) { if ($(this).text().trim() === '') remove++; });

            if (remove == currentTableRows) {
                $(this).hide();
                tds.hide();
            }
        });
    });

http://jsfiddle.net/nlovatt/JsLn8/

Пример с несколькими таблицами, который позволяет избежать использования идентификатора таблицы в селекторах

Вам нужен следующий код:

HTML

<table id="mytable" border="1">
    <thead>
        <tr><th>Column1</th><th>Column2</th><th>Column3</th><th>Column4</th></tr>
    </thead>
    <tbody>
        <tr class="data"><td>1st</td><td>1.1</td><td></td><td>1</td></tr>
        <tr class="data"><td>2nd</td><td>2.01</td><td></td><td>2</td></tr>  
        <tr class="data"><td>3rd</td><td>3.001</td><td></td><td>3</td></tr>  
        <tr class="data"><td>4th</td><td>4.01</td><td></td><td>4</td></tr>
    </tbody>
</table>

JavaScript

var $table = $('#mytable');
var thead = $table[0].tHead, tbody = $table[0].tBodies[0];
var colsLen = tbody.rows[0].cells.length, rowsLen = tbody.rows.length;
var hideNode = function(node) { if (node) node.style.display = "none"; };
for (var j = 0; j < colsLen; ++j) {
    var counter = 0;
    for (var i = 0; i < rowsLen; ++i) {
        if (tbody.rows[i].cells[j].childNodes.length == 0) ++counter;
    }
    if (counter == rowsLen) {
        for (var i = 0; i < rowsLen; ++i) {
            hideNode(tbody.rows[i].cells[j]);
        }
        hideNode(thead.rows[0].cells[j]);
    }
}

Если данные таблицы взяты из запроса MySQL, можно проверить, является ли столбец пустым, используя счетчик в поле (count = 0 означает, что значений нет).

Это довольно требовательно, когда у вас много полей, и условие IF необходимо и для соответствующих ячеек верхнего и нижнего колонтитула. Но это работает...

if ($sum_field>'0') echo "<th>field</th>";
if ($sum_field>'0') echo "<td>" . $row['field'] . "</td>";

Решение @nmat прекрасно работает, но не обрабатывает нижние колонтитулы.

Другие вопросы по тегам