Добрый день!
Как можно по чекбоксу спрятать все строки таблицы, колонки которой содержат одни нули ?
Мне пока приходит в голову вариант, при котором все пустые строки имеют класс < tr class="zero"> и с помощью js меняю style, но при этом вся таблица плывёт - ячейки становятся разной ширины.
Изначально таблицу создаю сам, поэтому есть возможность устанавливать классы и стили.
//js файл
function toggle() {
var rows = document.getElementsByClassName('zero');
for (var i = 0; i < rows.length; i++) {
if (this.checked)
rows[i].style.display = 'block';
else
rows[i].style.display = 'none'
}
}
document.getElementById('chkTest').onchange = toggle;
<input type="checkbox" id="chkTest" />
<label for="chkTest">Hide all zero rows</label>
<table>
<tr class="zero">
<td>Ivanov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Petrov</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>9</td>
<td>8</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Sidorov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Morozov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Tosterov</td>
<td>2</td>
<td>1</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</table>
Нашел данный способ на просторах инета. Сам только начал изучать JS.
P.S. Интересуют все варианты, но выделите, пожалуйста, как следует делать и какие способы быстрее работают.
Таблица примерная, по факту таблица содержит сотни строк.
Заранее спасибо.
реализация в вопросе плывет, потому что делаешь
rows[i].style.display = 'block';
у строк таблицы нужно устанавливать display: table-row;
В качестве альтернативы пробеганию по нужным строкам в цикле и выставлении видимости вручную можно устанавливать класс контейнеру, например таблице, и в css указать, что находясь внутри этого класса элементы с классом zero будут иметь display:none.
В этом случае управление видимостью регулируется добавлением/удалением класса контейнеру
Пример:
//js файл
function toggle() {
document.querySelector('table').classList.toggle('hide-zero');
}
document.getElementById('chkTest').onchange = toggle;
.hide-zero .zero {
display: none;
}
<input type="checkbox" id="chkTest" />
<label for="chkTest">Hide all zero rows</label>
<table>
<tr class="zero">
<td>Ivanov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Petrov</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>9</td>
<td>8</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Sidorov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Morozov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Tosterov</td>
<td>2</td>
<td>1</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</table>
display - Янус в CSS.
Для tr он table-row, поэтому Ваш код работает, только нужно правильно установить display обратно:
//js файл
function toggle() {
Array.from(document.querySelectorAll('.zero')).forEach(e => {
e.style.display = this.checked ? 'none' : 'table-row';
});
}
document.getElementById('chkTest').onchange = toggle;
<input type="checkbox" id="chkTest" />
<label for="chkTest">Hide all zero rows</label>
<table>
<tr class="zero">
<td>Ivanov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Petrov</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>9</td>
<td>8</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Sidorov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Morozov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Tosterov</td>
<td>2</td>
<td>1</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</table>
Что бы не плыло, можно вместо display изменять visibility:
function toggle() {
var rows = document.getElementsByClassName('zero');
for (var i = 0; i < rows.length; i++) {
if (this.checked)
rows[i].style.visibility = 'hidden';
else
rows[i].style.visibility = 'visible'
}
}
document.getElementById('chkTest').onchange = toggle;
<input type="checkbox" id="chkTest" />
<label for="chkTest">Hide all zero rows</label>
<table>
<tr class="zero">
<td>Ivanov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Petrov</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>9</td>
<td>8</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Sidorov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Morozov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Tosterov</td>
<td>2</td>
<td>1</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</table>
$('#chkTest').on('change', function(){ //На событие изменения чекера вешаем функцию
toggleZeroes();
})
function toggleZeroes(){
var target = 'table'; //целевая таблица, в нашем случае, просто любая
if(!$('#chkTest').prop('checked')){ //проверяем состояние чекера
$(target).find('tr').show();//если он СТАЛ ВЫКЛЮЧЕН то показываем все строки
return false; //выходим из ф-ции
}
$(target).find('tr').each(function() {//Иначе - по каждой строке проходимся
var total = 0;
$(this).find('td').each(function() {// И считаем сумму всех ячеек этой строки
var val = $(this).text()*1; //получаем значение ячейки, "*1" - необходимо, чтобы строго привести значение к числовому
total += !isNaN(val) ? val : 0; //Если вдруг, ячейка содержит в себе значения, не переводящиеся в число, просто прибавляем к ней 0
})
if (total == 0) { //Если в строке сумма элементов - 0, прячем строку
$(this).hide();
}
})
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="checkbox" id="chkTest" />
<label for="chkTest">Hide all zero rows</label>
<table>
<tr class="zero">
<td>Ivanov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Petrov</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>9</td>
<td>8</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Sidorov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="zero">
<td>Morozov</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Tosterov</td>
<td>2</td>
<td>1</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</table>
Немного костыльно, но рабоче.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости