【发布时间】:2020-05-29 19:38:19
【问题描述】:
我从这个论坛收集了一个脚本来帮助我从一个相当复杂的表格中过滤搜索结果。我希望用户能够 1. 选择类别并 2. 使用文本输入字段搜索表格。
我让这两个功能单独工作,但我希望搜索功能(文本输入)仅显示按所选类别类型过滤的结果。目前,搜索功能会覆盖类别输入并显示所有表行中的任何表行,而不考虑类别。
例如,在下面的代码中,我想将类别设置为“全部”并搜索 Taylor,返回 2 个结果。我还希望能够选择类别 3 并搜索 Taylor 并仅收到 1 个结果。
有人可以帮帮我吗? 谢谢!
<div class="container">
<h2>Finder</h2>
<div class="step1">
<p>Show category:</p>
</div>
<select type="search" class="select-table-filter" data-table="order-table" id="searchInput">
<option value="">All</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<input type="search" class="light-table-filter" data-table="order-table" placeholder="Search ..." />
<table class="order-table" id="myTable">
<thead>
<tr class="header">
<th>Category</th>
<th>Name</th>
<th>Last Name</th>
<th>Phone</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Taylor</td>
<td>Swift</td>
<td>1234 5678</td>
<td>taytay@gmail.com</td>
</tr>
<tr>
<td>2</td>
<td>John</td>
<td>Smith</td>
<td>1234 5678</td>
<td>johnnyboy@gmail.com</td>
</tr>
<tr>
<td>3</td>
<td>Jane</td>
<td>Doh</td>
<td>1234 5678</td>
<td>dohnut@gmail.com</td>
</tr>
<tr>
<td>3</td>
<td>Taylor</td>
<td>Doh</td>
<td>1234 5678</td>
<td>td@gmail.com</td>
</tr>
</tbody>
</table>
这是我的脚本:
(function(document) {
'use strict';
var LightTableFilter = (function(Arr) {
var _input;
var _select;
/***** FUNCTION FOR SEARCH INPUT *****/
function _onInputEvent(e) {
_input = e.target;
var tables = document.getElementsByClassName(_input.getAttribute('data-table'));
Arr.forEach.call(tables, function(table) {
Arr.forEach.call(table.tBodies, function(tbody) {
Arr.forEach.call(tbody.rows, _filter);
});
});
}
/***** INPUT CODE TO SEARCH ONLY FIRST COLUMN *****/
function _onSelectEvent(e) {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("searchInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[0];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
function _filter(row) {
var text = row.textContent.toLowerCase(), val = _input.value.toLowerCase();
row.style.display = text.indexOf(val) === -1 ? 'none' : 'table-row';
}
return {
init: function() {
var inputs = document.getElementsByClassName('light-table-filter');
var selects = document.getElementsByClassName('select-table-filter');
Arr.forEach.call(inputs, function(input) {
input.oninput = _onInputEvent;
});
Arr.forEach.call(selects, function(select) {
select.onchange = _onSelectEvent;
});
}
};
})(Array.prototype);
document.addEventListener('readystatechange', function() {
if (document.readyState === 'complete') {
LightTableFilter.init();
}
});
})(document);
【问题讨论】:
标签: javascript search filter html-table