JavaScript 中实现基于分组的前端产品列表筛选(含复选框过滤)

云明君_7495

云明君_7495

2026-04-01

537人浏览

原创

JavaScript 中实现基于分组的前端产品列表筛选(含复选框过滤)

本文介绍如何使用原生 javascript 为静态产品列表添加动态分组筛选功能:通过为每个列表项添加 data-group 属性,自动生成对应分组的复选框控件,并利用 classlist.toggle 实现点击切换显示/隐藏,无需重新渲染 dom。

本文介绍如何使用原生 javascript 为静态产品列表添加动态分组筛选功能:通过为每个列表项添加 data-group 属性,自动生成对应分组的复选框控件,并利用 classlist.toggle 实现点击切换显示/隐藏,无需重新渲染 dom。

在构建商品展示页时,常需支持用户按品类(如“热饮”“冷饮”)快速筛选内容。相比每次点击都重新生成整个列表,更高效的做法是一次性渲染全部数据,再通过 CSS 类控制显隐——这既提升性能,又保证交互流畅。

✅ 核心实现步骤

  1. 标记分组信息:在创建

  2. 元素时,将 item.group 写入 data-group 属性,便于后续选择器定位:
    li.dataset.group = item.group;
  3. 动态生成筛选控件:遍历 products 提取所有唯一分组(使用 new Set() 去重),为每个分组创建一个带 name 的复选框()和对应标签:

    javascript-pro
    javascript-pro

    专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

    下载
    const allGroups = [...new Set(products.map(p => p.group))];
    allGroups.forEach(group => {
      const cb = document.createElement('input');
      cb.name = group;
      cb.type = 'checkbox';
      cb.checked = true; // 默认显示该组
      cb.onchange = onCheckboxToggle;
      element.appendChild(cb);
    
      const label = document.createElement('label');
      label.textContent = group;
      label.htmlFor = group; // 注意:正确属性名为 htmlFor,非 for
      element.appendChild(label);
    });
  4. 绑定筛选逻辑:当复选框状态改变时,查找所有 data-group 匹配的

  5. 元素,并切换 .hide 类:
    const onCheckboxToggle = (e) => {
      const group = e.target.name;
      const items = document.querySelectorAll(`li[data-group="${group}"]`);
      items.forEach(item => item.classList.toggle('hide'));
    };

? 完整可运行代码示例



  <style>
    .hide { display: none; }
    #filterControls { margin-bottom: 1rem; }
    #filterControls label { margin-right: 1em; }
  </style><div id="filterControls"></div>
  
    <script> const products = [ { name: 'koffie', price: 2.50, group: 'warme dranken' }, { name: 'thee', price: 2.50, group: 'warme dranken' }, { name: 'cola', price: 3.50, group: 'koude dranken' }, { name: 'ice tea', price: 3.50, group: 'koude dranken' }, { name: 'patat', price: 3.50, group: 'friet' }, { name: 'patat mayo', price: 3.50, group: 'friet' }, { name: 'frikandel', price: 3.50, group: 'snacks' }, { name: 'kroket', price: 3.50, group: 'snacks' } ]; const list = document.querySelector('#productList'); const filterContainer = document.querySelector('#filterControls'); const addProducts = (array, element) => { array.forEach(item => { const li = document.createElement('li'); li.textContent = `${item.name} — €${item.price}`; li.dataset.group = item.group; element.appendChild(li); }); }; const addGroupBoxes = (array, container) => { const groups = [...new Set(array.map(p => p.group))]; groups.forEach(group => { const cb = document.createElement('input'); cb.type = 'checkbox'; cb.name = group; cb.checked = true; cb.onchange = onCheckboxToggle; const label = document.createElement('label'); label.textContent = group; label.htmlFor = group; container.append(cb, label, ' '); }); }; const onCheckboxToggle = (e) => { const group = e.target.name; document.querySelectorAll(`li[data-group="${group}"]`) .forEach(el => el.classList.toggle('hide')); }; // 初始化渲染 addProducts(products, list); addGroupBoxes(products, filterContainer); </script>

    ⚠️ 注意事项与优化建议

    • label.for 应写作 label.htmlFor:HTML 属性 for 在 DOM API 中映射为 htmlFor(因 for 是 JavaScript 保留字);
    • 避免重复渲染:本方案不调用 filter() 重建数组或重写 innerHTML,而是纯 CSS 控制可见性,响应更快、无闪烁;
    • 无障碍友好:为每个复选框添加
    • 扩展性提示:若需支持多条件组合筛选(如“热饮 + 小于 €3”),可在 onCheckboxToggle 中收集所有已勾选分组,再用 querySelectorAll 拼接多个 [data-group="xxx"] 选择器,或改用 Array.from(...).filter() 配合 classList.contains() 动态判断。

    此方法轻量、语义清晰、兼容性强,适用于中小型静态数据筛选场景,是原生 JavaScript 前端过滤的经典实践。

    Java免费学习笔记:立即使用
    解锁 Java 大师之旅:从入门到精通的终极指南

    相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    javascript

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    python是前端还是后端
    python是前端还是后端

    Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

    2023.08.11

    2403

    5

    前端如何实现即时通讯
    前端如何实现即时通讯

    实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

    2023.10.09

    5203

    6

    前端和后端的区别
    前端和后端的区别

    前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

    2024.03.19

    6250

    13

    php和前端的关联介绍
    php和前端的关联介绍

    php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

    2024.03.22

    5818

    10

    前端外包工作内容有哪些
    前端外包工作内容有哪些

    前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

    2024.05.22

    823

    5

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

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

    2023.06.20

    4766

    5

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

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

    2023.07.04

    1189

    3

    js四舍五入
    js四舍五入

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

    2023.07.04

    4684

    6

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

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

    2023.09.01

    940

    4

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    WebStorm 官方调试文档
    WebStorm 官方调试文档

    共0课时 | 0人学习

    React 教程
    React 教程

    共58课时 | 12.2万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 6.6万人学习