【发布时间】:2020-04-13 22:59:06
【问题描述】:
我有一个包含三列的 HTML 表格 - (姓名、年龄、城市)。我正在尝试实现类似“MS Excel”的功能,我可以在其中过滤多个列。
虽然过滤器是单独工作的,但当用户同时在多个输入字段中输入文本时,它们会出现故障。例如,只输入名称可以正常工作,但输入名称和城市,将完全排除名称过滤器。
function nameSearch() {
var input_name, input_age, input_city, filter, table, tr, td, i, txtValue_name, txtValue_age, txtValue_city;
input_name = document.getElementById("name-search");
input_age = document.getElementById("age-search");
input_city = document.getElementById("city-search");
filter_name = input_name.value.toUpperCase();
filter_age = input_age.value.toUpperCase();
filter_city = input_city.value.toUpperCase();
table = document.getElementById("custom-table");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td_name = tr[i].getElementsByTagName("td")[0];
if (td_name) {
txtValue_name = td_name.textContent || td_name.innerText;
if (txtValue_name.toUpperCase().indexOf(filter_name) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
function ageSearch() {
var input_name, input_age, input_city, filter, table, tr, td, i, txtValue_name, txtValue_age, txtValue_city;
input_name = document.getElementById("name-search");
input_age = document.getElementById("age-search");
input_city = document.getElementById("city-search");
filter_name = input_name.value.toUpperCase();
filter_age = input_age.value.toUpperCase();
filter_city = input_city.value.toUpperCase();
table = document.getElementById("custom-table");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td_age = tr[i].getElementsByTagName("td")[1];
if (td_age) {
txtValue_age = td_age.textContent || td_age.innerText;
if (txtValue_age.toUpperCase().indexOf(filter_age) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
function citySearch() {
var input_name, input_age, input_city, filter, table, tr, td, i, txtValue_name, txtValue_age, txtValue_city;
input_name = document.getElementById("name-search");
input_age = document.getElementById("age-search");
input_city = document.getElementById("city-search");
filter_name = input_name.value.toUpperCase();
filter_age = input_age.value.toUpperCase();
filter_city = input_city.value.toUpperCase();
table = document.getElementById("custom-table");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td_city = tr[i].getElementsByTagName("td")[2];
if (td_city) {
txtValue_city = td_city.textContent || td_city.innerText;
if (txtValue_city.toUpperCase().indexOf(filter_city) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
table,
td,
th {
border: 1px solid black;
border-collapse: collapse;
padding: 10px;
margin-top: 20px;
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="main.css">
</head>
<body>
<input type="text" id="name-search" onkeyup="nameSearch()" placeholder="Name.." class="table-search-filters">
<input type="text" id="age-search" onkeyup="ageSearch()" placeholder="Age.." class="table-search-filters">
<input type="text" id="city-search" onkeyup="citySearch()" placeholder="City.." class="table-search-filters">
<table id="custom-table">
<thead>
<th>Name</th>
<th>Age</th>
<th>City</th>
</thead>
<tbody>
<tr>
<td>Bruce</td>
<td>32</td>
<td>Gotham</td>
</tr>
<tr>
<td>Bane</td>
<td>32</td>
<td>Chicago</td>
</tr>
<tr>
<td>Joker</td>
<td>28</td>
<td>Gotham</td>
</tr>
<tr>
<td>Harvey</td>
<td>30</td>
<td>Miami</td>
</tr>
</tbody>
</table>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
我没有使用三个单独的“onkeyup”函数,而是尝试将所有输入映射到一个函数,但这仍然没有多大帮助。
【问题讨论】:
-
嗯,我想,你需要一个源值列表和可见值列表。源是主过滤器函数的输入,它返回列表的子集(可见值)。您应该始终将所有过滤器应用于您的源列表。 Keyup 事件侦听器应该只更改该过滤器的参数。
-
您能否详细说明源值列表是什么意思?
-
仅供参考:您可能想使用
oninput而不是onkeyup。就像现在一样,如果我使用鼠标复制和粘贴文本,它不会过滤,因为没有按下任何键。 -
这能回答你的问题吗? Filtering table multiple columns
-
@HereticMonkey 不幸的是,这不是因为,答案是跨多个列使用一个输入过滤器,而我正在寻找使用多个输入字段的多列过滤器。
标签: javascript html