当前位置: 首页 > news >正文

JavaScript 中实现基于分组的前端产品筛选功能

本文介绍如何使用原生 javascript 为商品列表添加动态分组筛选功能,通过 data 属性标记分组、自动生成带复选框的筛选控件,并利用 classlist.toggle 实现无刷新显隐切换。 本文介绍如何使用原生 javascript 为商品列表添加动态分组筛选功能,通过 data 属性标记分组、自动生成带复选框的筛选控件,并利用 classlist.toggle 实现无刷新显隐切换。在构建交互式商品展示页面时,常需让用户按类别(如“warme dranken”、“snacks”)快速筛选内容。与其每次点击都重新渲染 DOM,更高效的做法是:一次性渲染全部商品,并通过 CSS 类控制显隐。以下是完整、可直接运行的实现方案。? 核心思路为每个 <li> 元素添加 data-group 属性,绑定其所属分组;自动提取所有唯一分组名,动态生成带标签的复选框控件;复选框默认勾选(即初始显示全部),点击时切换对应分组商品的 .hide 类;利用 CSS 的 display: none 实现高性能隐藏/显示。? 完整代码实现<style> .hide { display: none; } #filterControls { margin-bottom: 16px; } #filterControls label { margin-right: 12px; margin-left: 4px; font-weight: 500; }</style><div id="filterControls"></div><ul id="productList"></ul>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 productList = document.querySelector('#productList');const filterControls = document.querySelector('#filterControls');// 步骤 1:渲染商品列表,并挂载 data-group 属性const addProducts = (array, container) => { array.forEach(item => { const li = document.createElement('li'); li.textContent = `${item.name} — €${item.price.toFixed(2)}`; li.dataset.group = item.group; // 关键:绑定分组标识 container.appendChild(li); });};// 步骤 2:自动生成分组筛选控件(复选框 + 标签)const addGroupBoxes = (array, container) => { // 提取唯一分组名(ES6 Set 去重) const groups = [...new Set(array.map(p => p.group))]; groups.forEach(group => { const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.name = group; checkbox.checked = true; // 默认显示该组 checkbox.className = 'group-filter'; checkbox.addEventListener('change', onCheckboxToggle); const label = document.createElement('label'); label.textContent = group; label.htmlFor = group; container.append(checkbox, label, document.createTextNode(' ')); // 添加空格分隔 });};// 步骤 3:处理复选框切换逻辑const onCheckboxToggle = (e) => { const groupName = e.target.name; const items = document.querySelectorAll(`li[data-group="${groupName}"]`); items.forEach(el => el.classList.toggle('hide'));};// 初始化渲染addProducts(products, productList);addGroupBoxes(products, filterControls);?? 注意事项与优化建议性能友好:不依赖 filter() 重建数组或重绘 DOM,仅操作 CSS 类,适用于数百项数据;无障碍友好:<label> 与 htmlFor 正确关联,支持键盘聚焦与空格切换;可扩展性强:如需多选联动(例如“仅显示 snacks + friet”),可改用「全选/反选」逻辑 + 维护一个激活分组 Set;样式隔离建议:若项目使用 CSS-in-JS 或 Shadow DOM,.hide 类应置于全局作用域或注入 <style> 块中;移动端适配:可为复选框容器添加 flex-wrap: wrap 防止换行错位。该方案兼顾简洁性与实用性,无需框架即可实现专业级筛选体验,是原生 JavaScript 动态内容过滤的经典范式。 文心快码 文心快码(Comate)是百度推出的一款AI辅助编程工具

http://www.jsqmd.com/news/701996/

相关文章:

  • VSCode量子配置深度解析(2024年唯一经实测验证的低延迟高并发开发环境构建法)
  • Qwen3.5-9B-GGUF保姆级教程:Supervisor日志路径配置与错误定位技巧
  • 基于MCP协议实现AI助手与Meilisearch搜索引擎的无缝集成
  • 梯度下降算法解析:从原理到工程实践
  • C++26反射在现代框架开发中的革命性应用(LLVM/Clang 19.0实测源码揭秘)
  • 量子参考框架:理论与实验验证
  • 基于深度强化学习的比特币交易智能体:从DQN到DeepSense的实战解析
  • VSCode + PlatformIO vs VSCode + CMake + Ninja:实测编译速度、内存占用、调试响应延迟三大维度对比(含12款MCU横评数据)
  • Omni-Vision Sanctuary模拟仿真应用:集成ExtendSim进行可视化流程模拟
  • macOS启动项管理利器maclaunch:统一管理launchd与Homebrew服务
  • Qwen3-VL-8B AI聊天系统实战:从零到一搭建图文对话Web应用
  • 机器学习中迭代插补方法解析与应用
  • 手把手教学:使用chainlit前端调用通义千问1.5-1.8B模型
  • Phi-4-mini-reasoning轻量模型对比:Phi-4-mini-reasoning vs Phi-3-mini
  • 智能体AI生产部署的五大扩展性挑战与解决方案
  • 深度学习中的激活函数:原理、选择与实践
  • 开源低代码平台ToolJet实战:30分钟构建企业级应用与架构解析
  • YOLO-v8.3快速开始:跟着demo代码,轻松实现物体检测
  • GitNexus:让AI编程助手拥有代码库全局视野的智能知识图谱工具
  • 机器学习实战:泰坦尼克号生存预测案例解析
  • bge-large-zh-v1.5应用案例:打造企业级智能文档搜索助手
  • AI技能工作流:一键为编程助手注入专业领域知识
  • 渐进式增长生成对抗网络(PGGAN)原理与实践
  • Phi-3-mini-4k-instruct-gguf企业应用:销售日报自动生成与关键指标结构化提取
  • Qwen3-4B-Thinking模型Token管理与成本优化详解
  • HyperOpt自动化机器学习:贝叶斯优化与scikit-learn集成
  • 分布式应用框架machtiani:模块化设计与云原生实践解析
  • TMSpeech:Windows本地实时语音识别终极指南,3分钟打造你的私人会议记录官
  • hyperf API 契约测试平台开源完整流程(从 0 到持续维护)==写一个开源项目全流程
  • Kurtosis封装AutoGPT:一键部署AI智能体,告别环境依赖地狱