JS Как сделать фильтрацию в таблице с учетом фильтра в другом столбце?
Подскажите, как сделать чтобы фильтрация в таблице работала с учетом выбранного фильтра в другом столбце?
table = document.getElementById("myTable");
table.addEventListener('keyup', function(e) {
let target = e.target;
input = document.getElementsByClassName(target.className)[0];
filter = input.value.toUpperCase();
console.log(filter);
if (target.tagName == "INPUT") {
let num = +target.className;
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[num];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
});
#myInput {
background-position: 10px 12px;
/* Расположите значок поиска */
background-repeat: no-repeat;
/* Не повторяйте изображение значка */
width: 30%;
/* Полная ширина */
font-size: 16px;
/* Увеличить размер шрифта */
padding: 12px 20px 12px 40px;
/* Добавить немного отступов */
border: 1px solid #ddd;
/* Добавить серую границу */
margin-bottom: 12px;
/* Добавить некоторое пространство под входом */
}
#myTable {
border-collapse: collapse;
/* Свернуть границы */
width: 100%;
/* Полная ширина */
border: 1px solid #ddd;
/* Добавить серую границу */
font-size: 18px;
/* Увеличить размер шрифта */
}
#myTable th,
#myTable td {
text-align: left;
/* Выравнивание текста по левому краю */
padding: 12px;
/* Добавить отступ */
}
#myTable tr {
/* Добавить нижнюю границу для всех строк таблицы */
border-bottom: 1px solid #ddd;
}
#myTable tr.header,
#myTable tr:hover {
/* Добавить серый цвет фона для заголовка таблицы и при наведении курсора мыши */
background-color: #f1f1f1;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<table id="myTable">
<tr class="header">
<th style="width:40%;">Имя: <input type="text" id="myInput" class="0" placeholder="Поиск имен.."></th>
<th style="width:30%;">Страна: <input type="text" id="myInput" class="1" placeholder="Поиск имен.."></th>
<th style="width:30%;">Статус: <input type="text" id="myInput" class="2" placeholder="Поиск имен.."></th>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Германия</td>
<td>Город</td>
</tr>
<tr>
<td>Berglunds snabbkop</td>
<td>Швеция</td>
<td>Столица</td>
</tr>
<tr>
<td>Island Trading</td>
<td>Великобритания</td>
<td>Столица</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Германия</td>
<td>Гоорд</td>
</tr>
</table>
<script src="script.js"></script>
</body>
</html>
Ответы (1 шт):
Автор решения: UModeL
→ Ссылка
Что-то намудрили Вы и с разметкой и со стилями и со скриптом. Копипастить надо вдумчиво :-) В общем, я вижу решение так (не слишком лаконично, но просто и понятно) :
table = document.getElementById('myTable');
// Делегирование обработчика для полей ввода
table.addEventListener('input', fResultFilter);
// Назначение обработчиков для кнопок очистки
[...table.querySelectorAll('.header input + span')].forEach(function(el) {
el.addEventListener('click', function(ev) {
ev.target.previousElementSibling.value = '';
ev.target.previousElementSibling.dispatchEvent(new Event('input', { bubbles: true }));
});
});
function fResultFilter(ev) {
// Скрытие/показ кнопок очистки
ev.target.nextElementSibling.style.transform = (ev.target.value != '') ? 'scaleX(1)' : '';
// Получаем все строки, кроме заголовка
let aTRs = [...table.querySelectorAll('tr:not(.header)')];
// Получаем значения всех полей поиска
let aSearch = [...table.querySelectorAll('th > input')];
// Прогоняем строки через цепочку фильтров
aTRs.filter(function(el) {
if (el.children[0].textContent.search(new RegExp(`${aSearch[0].value}`, 'i')) < 0) {
el.style.display = 'none';
return false;
} else {
return true;
}
}).filter(function(el) {
if (el.children[1].textContent.search(new RegExp(`${aSearch[1].value}`, 'i')) < 0) {
el.style.display = 'none';
return false;
} else {
return true;
}
}).filter(function(el) {
if (el.children[2].textContent.search(new RegExp(`${aSearch[2].value}`, 'i')) < 0) {
el.style.display = 'none';
return false;
} else {
// Показываем только нужные строки
el.style.display = '';
return true;
}
});
}
.header input {
background-position: 10px 12px;
/* Расположите значок поиска */
background-repeat: no-repeat;
/* Не повторяйте изображение значка */
width: 100%;
/* Полная ширина */
font-size: 16px;
/* Увеличить размер шрифта */
padding: 10px 15px 10px 20px;
/* Добавить немного отступов */
border: 1px solid #ddd;
/* Добавить серую границу */
box-sizing: border-box;
}
.header input+span {
position: absolute;
right: 0px;
bottom: 23%;
display: inline-block;
height: 19px;
width: 19px;
border: 2px solid rgba(33, 110, 243, 0.44);
border-radius: 50%;
background-color: #fff;
line-height: 19px;
text-align: center;
transform: scaleX(0);
transition: transform .4s ease;
cursor: pointer;
color: red;
}
#myTable {
border-collapse: collapse;
/* Свернуть границы */
width: 100%;
/* Полная ширина */
border: 3px solid #ddd;
/* Добавить серую границу */
font-size: 18px;
/* Увеличить размер шрифта */
}
#myTable th,
#myTable td {
text-align: left;
/* Выравнивание текста по левому краю */
padding: 10px;
/* Добавить отступ */
vertical-align: middle;
}
#myTable th {
position: relative;
}
#myTable tr {
/* Добавить нижнюю границу для всех строк таблицы */
border-bottom: 1px solid #ddd;
}
#myTable tr.header,
#myTable tr:hover {
/* Добавить серый цвет фона для заголовка таблицы и при наведении курсора мыши */
background-color: #f1f1f1;
}
<table id="myTable">
<tr class="header">
<th>Имя: <input type="text" placeholder="Поиск..."><span>×</span></th>
<th>Страна: <input type="text" placeholder="Поиск..."><span>×</span></th>
<th>Статус: <input type="text" placeholder="Поиск..."><span>×</span></th>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Германия</td>
<td>Город</td>
</tr>
<tr>
<td>Berglunds snabbkop</td>
<td>Швеция</td>
<td>Столица</td>
</tr>
<tr>
<td>Island Trading</td>
<td>Великобритания</td>
<td>Столица</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Германия</td>
<td>Гоорд</td>
</tr>
</table>