HTML表格数据动态过滤教程
在网页开发中,表格是展示结构化数据的常用组件,当表格数据量较大时,静态展示会让用户查找目标信息变得困难。动态过滤功能可以让用户通过输入关键词,快速筛选出表格中符合条件的数据,提升页面交互体验。本文将介绍如何基于原生JavaScript实现HTML表格数据的动态过滤功能,无需依赖第三方库,逻辑清晰且易于扩展。
基础HTML表格结构搭建
首先我们需要先构建一个包含表头和数据的标准HTML表格,同时添加一个输入框作为过滤条件的输入入口。注意这里提到的<table>、<thead>、<tbody>等标签都是HTML的表格相关标签,需要按照规范转义展示。
下面的代码展示了基础表格的结构,表格包含姓名、年龄、所属部门三列,并且预留了过滤输入框:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表格动态过滤示例</title>
<style>
.filter-container {
margin-bottom: 15px;
}
#filterInput {
padding: 8px;
width: 300px;
font-size: 14px;
}
table {
border-collapse: collapse;
width: 100%;
max-width: 800px;
}
th, td {
border: 1px solid #ddd;
padding: 12px;
text-align: left;
}
th {
background-color: #f5f5f5;
}
.hidden {
display: none;
}
</style>
</head>
<body>
<div class="filter-container">
<label for="filterInput">输入关键词过滤表格数据:</label>
<input type="text" id="filterInput" placeholder="请输入姓名、年龄或部门关键词">
</div>
<table id="dataTable">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>所属部门</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>28</td>
<td>技术部</td>
</tr>
<tr>
<td>李四</td>
<td>32</td>
<td>产品部</td>
</tr>
<tr>
<td>王五</td>
<td>25</td>
<td>技术部</td>
</tr>
<tr>
<td>赵六</td>
<td>35</td>
<td>运营部</td>
</tr>
<tr>
<td>孙七</td>
<td>29</td>
<td>产品部</td>
</tr>
</tbody>
</table>
<script src="filter.js"></script>
</body>
</html>上面的代码中,我们通过CSS设置了表格和输入框的基础样式,同时定义了.hidden类用于控制不符合条件的行隐藏。表格的<tbody>中包含了5条示例数据,后续过滤逻辑会操作这些行。
动态过滤逻辑实现
接下来我们需要编写JavaScript代码,监听输入框的输入事件,每次输入内容变化时,遍历表格的所有数据行,判断行内的文本内容是否包含输入的关键词,不符合条件的行就添加hidden类隐藏,符合条件的则移除该类显示。
下面是过滤逻辑的完整代码,我们将其放在独立的filter.js文件中,也可以直接内联到HTML的<script>标签中:
// 获取输入框和表格tbody元素
const filterInput = document.getElementById('filterInput');
const tableBody = document.querySelector('#dataTable tbody');
// 获取所有表格数据行
const tableRows = tableBody.getElementsByTagName('tr');
// 定义过滤函数
function filterTable() {
// 获取输入的关键词,转为小写方便不区分大小写匹配
const filterValue = filterInput.value.toLowerCase().trim();
// 遍历所有行
for (let i = 0; i < tableRows.length; i++) {
const currentRow = tableRows[i];
// 获取当前行的所有单元格
const cells = currentRow.getElementsByTagName('td');
let rowContainsFilter = false;
// 遍历当前行的所有单元格,检查是否包含关键词
for (let j = 0; j < cells.length; j++) {
const cellText = cells[j].textContent.toLowerCase();
// 如果单元格内容包含关键词,标记该行符合条件
if (cellText.includes(filterValue)) {
rowContainsFilter = true;
break;
}
}
// 根据匹配结果控制行的显示隐藏
if (rowContainsFilter || filterValue === '') {
currentRow.classList.remove('hidden');
} else {
currentRow.classList.add('hidden');
}
}
}
// 监听输入框的输入事件,每次输入都触发过滤
filterInput.addEventListener('input', filterTable);
// 页面加载完成后先执行一次过滤,处理初始状态
window.addEventListener('DOMContentLoaded', filterTable);这段逻辑的核心流程是:首先获取输入框和表格行的DOM元素,然后定义filterTable函数,每次调用时先获取输入框的内容并做小写处理,接着遍历每一行数据,检查该行所有单元格的内容是否包含关键词。如果包含则显示该行,否则隐藏。最后给输入框绑定input事件,只要输入内容变化就触发过滤,同时页面加载完成后执行一次初始过滤。
功能扩展与优化建议
上述实现已经可以满足基础的表格过滤需求,在实际使用中还可以根据场景做进一步优化:
- 如果需要过滤时忽略某些列,可以在遍历单元格时增加列索引判断,比如只过滤姓名和部门列,跳过年龄列。
- 可以添加防抖处理,避免用户输入过快时频繁触发过滤逻辑,减少性能消耗,比如设置300毫秒的延迟执行。
- 如果表格数据是动态加载的,比如通过接口获取后渲染到页面,只需要在数据渲染完成后重新获取
tableRows即可,过滤逻辑不需要修改。 - 可以添加无匹配结果时的提示,当所有行都被隐藏时,在表格下方显示“未找到匹配的数据”的提示文本。
总结
通过原生JavaScript实现HTML表格动态过滤功能,不需要依赖任何第三方框架,核心逻辑就是监听输入事件、遍历表格行、匹配关键词、控制行的显示隐藏。这种方式兼容性好,逻辑简单,适合大多数中小型项目的表格过滤需求。开发者可以根据实际的业务场景,在上述基础上灵活扩展功能,满足更复杂的使用要求。