0

0

基于data-group属性实现带标题的表格数据过滤

碧海醫心

碧海醫心

发布时间:2025-11-30 12:00:08

|

356人浏览过

|

来源于php中文网

原创

基于data-group属性实现带标题的表格数据过滤

本教程详细介绍了如何使用jQuery和HTML的`data-group`属性,实现对包含多个`thead`部分的复杂表格进行高效的数据过滤。通过将`thead`和其对应的`tbody`逻辑分组,我们能够确保在搜索时,不仅显示匹配的行,还能同时显示其所属的标题部分,从而提升用户体验和数据可读性。

在现代Web应用中,展示大量数据通常会采用表格形式。当表格数据量庞大且结构复杂,例如包含多个逻辑分区,每个分区都有自己的标题()时,实现一个用户友好的搜索过滤功能就显得尤为重要。传统的表格过滤方法往往只关注

中的行(),而忽略了与这些行相关联的部分的可见性,这可能导致用户在过滤后失去上下文信息。

挑战:多thead表格的过滤问题

假设我们有一个大型表格,其中包含多个独立的部门信息,每个部门都由一个作为标题,紧随其后是该部门的具体数据行(

)。当用户输入搜索关键词时,我们期望的行为是:
  1. 如果某个中的行匹配搜索词,则该行应显示。
  2. 与该匹配行关联的也应该显示,即使本身的内容不匹配搜索词。
  3. 如果本身的内容匹配搜索词,则该及其所有关联的 行都应该显示。
  4. 不匹配的和 行应被隐藏。

    原始的过滤逻辑通常只针对tbody tr元素:

    $(document).ready(function() {
      $("#myInput").on("keyup", function() {
        var value = $(this).val().toLowerCase();
        $("#myTable tbody tr").filter(function() {
          $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
        });
      });
    });

    这种方法的问题在于,它只会根据

    的内容来切换其可见性,而不会考虑其父级。结果是,即使有匹配的显示出来,其所属的也可能因为没有直接匹配搜索词而被隐藏,导致表格结构混乱,用户难以理解显示的数据属于哪个分类。

    解决方案:利用data-group属性进行逻辑分组

    为了解决上述问题,我们可以引入自定义的HTML data属性来建立和

    造梦阁AI
    造梦阁AI

    AI小说推文一键成片,你的故事值得被看见

    下载
    之间的逻辑关联。通过为每个和其对应的 分配一个相同的data-group值,我们可以在JavaScript中轻松地识别和操作这些分组。

    1. 修改HTML结构

    首先,我们需要修改表格的HTML结构,为每个和其紧邻的

    添加一个唯一的data-group属性。例如:
    Information about department
    Name - It Phone - 1111111 E-mail - [email protected]
    Information about department 2
    Name - Finance Phone - 1111112 E-mail - [email protected]
    Name - Finance2 Phone - 1111113 E-mail - [email protected]

    这里,我们为每个和

    对分配了一个唯一的data-group值(例如"1", "2"等)。

    2. 优化JavaScript过滤逻辑

    接下来,我们需要修改JavaScript代码,使其能够利用data-group属性来智能地控制元素的显示。

    $(document).ready(function() {
      $("#myInput").on("keyup", function() {
        var value = $(this).val().toLowerCase().trim(); // 获取搜索值并转换为小写,去除首尾空格
    
        // 遍历表格中的每一个 thead 元素
        $("#myTable thead").each(function() {
          var group = $(this).data("group"); // 获取当前 thead 的 data-group 值
          // 检查 thead 本身的内容是否匹配搜索词
          var isTheadMatched = $(this).text().toLowerCase().indexOf(value) > -1;
    
          // 构建选择器,查找与当前 thead 具有相同 data-group 的 tbody 中的所有 tr
          var selector = `tbody[data-group='${group}'] tr`;
          var allRows = $('#myTable').find(selector);
          var isAnyRowMatched = false; // 标志,表示当前分组中是否有任何行匹配搜索词
    
          // 遍历当前分组中的所有 tbody 行
          for (var row of $(allRows)) {
            // 判断当前行是否应该显示:
            // 1. thead 本身匹配搜索词 (isTheadMatched)
            // 2. 或者当前行内容匹配搜索词
            const isRowMatched = isTheadMatched || $(row).text().toLowerCase().indexOf(value) > -1;
            $(row).toggle(isRowMatched); // 切换行的显示/隐藏
    
            // 如果当前行内容匹配搜索词(即使 thead 不匹配),则标记此分组有匹配项
            if ($(row).text().toLowerCase().indexOf(value) > -1) {
              isAnyRowMatched = true;
            }
          }
    
          // 切换当前 thead 的显示/隐藏:
          // 如果 thead 本身匹配搜索词,或者其关联的 tbody 中有任何行匹配搜索词,则显示 thead
          $(this).toggle(isTheadMatched || isAnyRowMatched);
        });
      });
    });

    代码解析:

    1. 事件监听与预处理: 当用户在搜索框输入时触发keyup事件,获取输入值并转换为小写,并使用trim()去除可能存在的首尾空格,确保搜索的准确性。
    2. 遍历: 代码不再直接操作 ,而是遍历表格中的每一个元素。
    3. 获取分组信息: 对于每个,获取其data-group属性值,这将用于定位其对应的 。
    4. 自身匹配判断: 检查当前的文本内容是否包含搜索词。
    5. 查找关联行: 使用data-group值构建一个选择器(例如tbody[data-group='1'] tr),精确地找到与当前关联的所有 行。
    6. 行匹配判断与显示:
      • 遍历这些关联的行。
      • 对于每一行,判断它是否应该显示:如果本身匹配搜索词,或者当前行匹配搜索词,则该行显示。
      • 同时,使用isAnyRowMatched标志记录当前分组中是否有任何行匹配搜索词。
      • 显示逻辑: 最后,根据以下条件切换当前的显示状态:
        • 本身匹配搜索词 (isTheadMatched)。
        • 或者,其关联的中有任何一行匹配搜索词 (isAnyRowMatched)。 只要满足其中一个条件,就会显示,否则隐藏。

          完整示例代码

          
          
          
          
          
          Filter Table Data with Thead
          
          
          
          
          
          

          带有分组标题的表格数据过滤

          部门信息:IT部
          姓名 - Tom 电话 - 1111111 邮箱 - tom@example.com
          姓名 - Jerry 电话 - 1111112 邮箱 - jerry@example.com
          部门信息:财务部
          姓名 - Alice 电话 - 2222221 邮箱 - alice@example.com
          姓名 - Bob 电话 - 2222222 邮箱 - bob@example.com
          姓名 - Bob Junior 电话 - 2222223 邮箱 - bobjr@example.com
          部门信息:市场部
          姓名 - Carol 电话 - 3333331 邮箱 - carol@example.com

          注意事项与最佳实践

          • data-group值的唯一性: 确保每个和其对应的 的data-group值是唯一的,以便正确关联。
          • 性能考量: 对于包含成千上万个和 分组的巨型表格,每次keyup事件都遍历所有和 可能会有性能开销。可以考虑:
            • 防抖(Debounce): 限制keyup事件触发的频率,例如在用户停止输入一段时间后才执行搜索。
            • 虚拟滚动(Virtual Scrolling): 如果表格行数极其庞大,只渲染视口内的行,这会使过滤逻辑更复杂但性能更高。
          • 用户体验: 可以在搜索框旁边添加一个清除按钮,方便用户快速清空搜索内容并恢复表格的完整视图。
          • 可访问性: 确保过滤功能对屏幕阅读器等辅助技术是可访问的。
          • 多语言支持: 如果表格内容是多语言的,确保搜索逻辑能够处理不同语言的字符集。
          • 总结

            通过巧妙地利用HTML的data-group属性来建立和

            之间的逻辑关联,并结合jQuery的遍历和选择器功能,我们成功实现了一个功能强大且用户友好的表格数据过滤方案。这个方案不仅能够精确地过滤数据行,还能智能地管理其所属标题的可见性,极大地提升了复杂表格的可读性和交互体验。这种分组过滤的思路同样可以应用于其他需要结构化内容筛选的场景。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

553

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

731

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

656

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号