任务
我有一个包含多列的表。每列上方都有一个输入字段。我想过滤每一行,以便表显示具有至少一列的任何行,其中至少一列包含该列上方的输入字段中的值。
问题
当我尝试在输入字段中输入值时,该表不会过滤。我不确定我的错误在哪里。由于我仍处于学习阶段,因此也将感谢您提供有关语法或性能的任何提示。根据本网站上的各种答案,以下是最小的(尚未完成)工作示例是我能做的最好的事情。
代码
function performReset() {
document.getElementById("inputName").value = "";
document.getElementById("inputCity").value = "";
document.getElementById("inputCountry").value = "";
filterTable();
}
function filterTable() {
// Get the table rows.
let rows = document.querySelector("#myTable > tbody").rows;
// Get the inputed values to filter against.
let inputedName = document.getElementById("inputName").value.toUpperCase();
let inputedCity = document.getElementById("inputCity").value.toUpperCase();
let inputedCountry = document.getElementById("inputCountry").value.toUpperCase();
// Loop over the rows to perform the filter.
let totalRows = rows.length;
for (let i = 0; i < totalRows; i++) {
// Get the contents of the relevant cell data.
let rowName = rows[i].cells[0].textContent.toUpperCase();
let rowCity = rows[i].cells[1].textContent.toUpperCase();
let rowCountry = rows[i].cells[2].textContent.toUpperCase();
// Define an array of conditions.
// Note: the conditions are evaluated here.
let conditionsArray = [
rowName.indexOf(inputedName) > -1,
rowCity.indexOf(inputedCity) > -1,
rowCountry.indexOf(inputedCountry) > -1
];
// If any of the above conditions are true then show the row,
// otherwise turn of displaying that row.
if (conditionsArray.indexOf(true) > -1) {
rows[i].display = "";
} else {
rows[i].display = "none";
}
}
}
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<h2 class="w3-center">Filter Table Test</h2>
<p class="w3-center"><button id="buttonReset" onclick="performReset()" class="w3-button w3-grey w3-hover-light-grey">Reset</button></p>
<table id="myTable" class="w3-table w3-striped w3-hoverable">
<!--Inputs Used For Filtering-->
<tr>
<td><input id="inputName" onkeyup="filterTable()" class="w3-input" placeholder="Name..."></td>
<td><input id="inputCity" onkeyup="filterTable()" class="w3-input" placeholder="City..."></td>
<td><input id="inputCountry" onkeyup="filterTable()" class="w3-input" placeholder="Country..."></td>
</tr>
<!--Column Headings-->
<tr class="w3-dark-grey">
<th>Customer</th>
<th>City</th>
<th>Country</th>
</tr>
<!--Row Data-->
<tbody>
<tr class="item">
<td>Alfreds Futterkiste</td>
<td>Berlin</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Berglunds snabbköp</td>
<td>Lule </td>
<td>Sweden</td>
</tr>
<tr class="item">
<td>Centro comercial Moctezuma</td>
<td>México D.F.</td>
<td>Mexico</td>
</tr>
<tr class="item">
<td>Ernst Handel</td>
<td>Graz</td>
<td>Austria</td>
</tr>
<tr class="item">
<td>FISSA Fabrica Inter. Salchichas S.A.</td>
<td>Madrid</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Galería del gastrónomo</td>
<td>Barcelona</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Island Trading</td>
<td>Cowes</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Königlich Essen</td>
<td>Brandenburg</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Laughing Bacchus Wine Cellars</td>
<td>Vancouver</td>
<td>Canada</td>
</tr>
<tr class="item">
<td>Magazzini Alimentari Riuniti</td>
<td>Bergamo</td>
<td>Italy</td>
</tr>
<tr class="item">
<td>North/South</td>
<td>London</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Paris spécialités</td>
<td>Paris</td>
<td>France</td>
</tr>
<tr class="item">
<td>Rattlesnake Canyon Grocery</td>
<td>Albuquerque</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Simons bistro</td>
<td>København</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>The Big Cheese</td>
<td>Portland</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Vaffeljernet</td>
<td>Århus</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>Wolski Zajazd</td>
<td>Warszawa</td>
<td>Poland</td>
</tr>
</tbody>
</table>
编辑1:已将document.querySelector('#myTable tbody')
修改为document.querySelector('#myTable > tbody')
。但是我的问题仍然存在。
答案 0 :(得分:1)
您可以通过传递 event 和特定的 index 来将过滤器函数附加到所有 input 元素的 event em>。
尝试以下方式:
function performReset() {
document.getElementById("inputName").value = "";
document.getElementById("inputCity").value = "";
document.getElementById("inputCountry").value = "";
filterTable(event, 0);
}
function filterTable(event, index) {
var filter = event.target.value.toUpperCase();
var rows = document.querySelector("#myTable tbody").rows;
for (var i = 0; i < rows.length; i++) {
var firstCol = rows[i].cells[0].textContent.toUpperCase();
var secondCol = rows[i].cells[1].textContent.toUpperCase();
var thirdCol = rows[i].cells[2].textContent.toUpperCase();
if ((firstCol.indexOf(filter) > -1 && index == 0) || (secondCol.indexOf(filter) > -1 && index == 1) || (thirdCol.indexOf(filter) > -1 && index == 2)) {
rows[i].style.display = "";
} else {
rows[i].style.display = "none";
}
}
}
document.querySelectorAll('input.w3-input').forEach(function(el,idx){
el.addEventListener('keyup', function(e){
filterTable(e, idx);
}, false);
});
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<h2 class="w3-center">Filter Table Test</h2>
<p class="w3-center"><button id="buttonReset" onclick="performReset()" class="w3-button w3-grey w3-hover-light-grey">Reset</button></p>
<table id="myTable" class="w3-table w3-striped w3-hoverable">
<!--Column Headings-->
<thead>
<tr>
<td><input id="inputName" class="w3-input" placeholder="Name..."></td>
<td><input id="inputCity" class="w3-input" placeholder="City..."></td>
<td><input id="inputCountry" class="w3-input" placeholder="Country..."></td>
</tr>
</thead>
<!--Row Data-->
<tbody>
<tr class="item">
<td>Alfreds Futterkiste</td>
<td>Berlin</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Berglunds snabbköp</td>
<td>Lule </td>
<td>Sweden</td>
</tr>
<tr class="item">
<td>Centro comercial Moctezuma</td>
<td>México D.F.</td>
<td>Mexico</td>
</tr>
<tr class="item">
<td>Ernst Handel</td>
<td>Graz</td>
<td>Austria</td>
</tr>
<tr class="item">
<td>FISSA Fabrica Inter. Salchichas S.A.</td>
<td>Madrid</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Galería del gastrónomo</td>
<td>Barcelona</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Island Trading</td>
<td>Cowes</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Königlich Essen</td>
<td>Brandenburg</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Laughing Bacchus Wine Cellars</td>
<td>Vancouver</td>
<td>Canada</td>
</tr>
<tr class="item">
<td>Magazzini Alimentari Riuniti</td>
<td>Bergamo</td>
<td>Italy</td>
</tr>
<tr class="item">
<td>North/South</td>
<td>London</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Paris spécialités</td>
<td>Paris</td>
<td>France</td>
</tr>
<tr class="item">
<td>Rattlesnake Canyon Grocery</td>
<td>Albuquerque</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Simons bistro</td>
<td>København</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>The Big Cheese</td>
<td>Portland</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Vaffeljernet</td>
<td>Århus</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>Wolski Zajazd</td>
<td>Warszawa</td>
<td>Poland</td>
</tr>
</tbody>
</table>
答案 1 :(得分:0)
@Mamun的答案很好并且有效。 我使用的另一个解决方案是: 我在三列中只使用了一个输入标签
您也可以尝试此代码
CSS :
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<style>
* {
box-sizing: border-box;
}
#myInput {
background-image: url('/css/searchicon.png');
background-position: 10px 10px;
background-repeat: no-repeat;
width: 100%;
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;
}
</style>
</head>
JAVASCRIPT:
<script>
function performReset() {
document.getElementById("myInput").value = "";
filterTable();
}
function filterTable() {
var input, filter, table, tr, i,name,country,city;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
//write here which columns you want filter...
name=tr[i].getElementsByTagName("td")[0];
city=tr[i].getElementsByTagName("td")[1];
country=tr[i].getElementsByTagName("td")[2];
if (name) {
if (name.innerHTML.toUpperCase().indexOf(filter) > -1 ||city.innerHTML.toUpperCase().indexOf(filter) > -1 || country.innerHTML.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
HTML:
<body>
<p class="w3-center"><button id="buttonReset" onclick="performReset()" class="w3-button w3-grey w3-hover-light-grey">Reset</button></p>
<h2>My Customers</h2>
<input type="text" id="myInput" onkeyup="filterTable()" placeholder="Search for names.." title="Type in a name">
<table id="myTable">
<tr class="header">
<th style="width:60%;">Name</th>
<th style="width:20%;">City</th>
<th style="width:20%;">Country</th>
</tr>
<tbody>
<tr class="item">
<td>Alfreds Futterkiste</td>
<td>Berlin</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Berglunds snabbköp</td>
<td>Lule </td>
<td>Sweden</td>
</tr>
<tr class="item">
<td>Centro comercial Moctezuma</td>
<td>México D.F.</td>
<td>Mexico</td>
</tr>
<tr class="item">
<td>Ernst Handel</td>
<td>Graz</td>
<td>Austria</td>
</tr>
<tr class="item">
<td>FISSA Fabrica Inter. Salchichas S.A.</td>
<td>Madrid</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Galería del gastrónomo</td>
<td>Barcelona</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Island Trading</td>
<td>Cowes</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Königlich Essen</td>
<td>Brandenburg</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Laughing Bacchus Wine Cellars</td>
<td>Vancouver</td>
<td>Canada</td>
</tr>
<tr class="item">
<td>Magazzini Alimentari Riuniti</td>
<td>Bergamo</td>
<td>Italy</td>
</tr>
<tr class="item">
<td>North/South</td>
<td>London</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Paris spécialités</td>
<td>Paris</td>
<td>France</td>
</tr>
<tr class="item">
<td>Rattlesnake Canyon Grocery</td>
<td>Albuquerque</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Simons bistro</td>
<td>København</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>The Big Cheese</td>
<td>Portland</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Vaffeljernet</td>
<td>Århus</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>Wolski Zajazd</td>
<td>Warszawa</td>
<td>Poland</td>
</tr>
</tbody>
</table>
</body>
所有(SNIPPET)代码:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<style>
* {
box-sizing: border-box;
}
#myInput {
background-image: url('/css/searchicon.png');
background-position: 10px 10px;
background-repeat: no-repeat;
width: 100%;
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;
}
</style>
</head>
<body>
<p class="w3-center"><button id="buttonReset" onclick="performReset()" class="w3-button w3-grey w3-hover-light-grey">Reset</button></p>
<h2>My Customers</h2>
<input type="text" id="myInput" onkeyup="filterTable()" placeholder="Search for names.." title="Type in a name">
<table id="myTable">
<tr class="header">
<th style="width:60%;">Name</th>
<th style="width:20%;">City</th>
<th style="width:20%;">Country</th>
</tr>
<tbody>
<tr class="item">
<td>Alfreds Futterkiste</td>
<td>Berlin</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Berglunds snabbköp</td>
<td>Lule </td>
<td>Sweden</td>
</tr>
<tr class="item">
<td>Centro comercial Moctezuma</td>
<td>México D.F.</td>
<td>Mexico</td>
</tr>
<tr class="item">
<td>Ernst Handel</td>
<td>Graz</td>
<td>Austria</td>
</tr>
<tr class="item">
<td>FISSA Fabrica Inter. Salchichas S.A.</td>
<td>Madrid</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Galería del gastrónomo</td>
<td>Barcelona</td>
<td>Spain</td>
</tr>
<tr class="item">
<td>Island Trading</td>
<td>Cowes</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Königlich Essen</td>
<td>Brandenburg</td>
<td>Germany</td>
</tr>
<tr class="item">
<td>Laughing Bacchus Wine Cellars</td>
<td>Vancouver</td>
<td>Canada</td>
</tr>
<tr class="item">
<td>Magazzini Alimentari Riuniti</td>
<td>Bergamo</td>
<td>Italy</td>
</tr>
<tr class="item">
<td>North/South</td>
<td>London</td>
<td>UK</td>
</tr>
<tr class="item">
<td>Paris spécialités</td>
<td>Paris</td>
<td>France</td>
</tr>
<tr class="item">
<td>Rattlesnake Canyon Grocery</td>
<td>Albuquerque</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Simons bistro</td>
<td>København</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>The Big Cheese</td>
<td>Portland</td>
<td>USA</td>
</tr>
<tr class="item">
<td>Vaffeljernet</td>
<td>Århus</td>
<td>Denmark</td>
</tr>
<tr class="item">
<td>Wolski Zajazd</td>
<td>Warszawa</td>
<td>Poland</td>
</tr>
</tbody>
</table>
<script>
function performReset() {
document.getElementById("myInput").value = "";
filterTable();
}
function filterTable() {
var input, filter, table, tr, i,name,country,city;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
//write here which column you want filter
name=tr[i].getElementsByTagName("td")[0];
city=tr[i].getElementsByTagName("td")[1];
country=tr[i].getElementsByTagName("td")[2];
if (name) {
if (name.innerHTML.toUpperCase().indexOf(filter) > -1 ||city.innerHTML.toUpperCase().indexOf(filter) > -1 || country.innerHTML.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
</body>
</html>