0

0

实现单选列表项:使用事件委托与动态类控制

霞舞

霞舞

发布时间:2026-03-01 17:14:08

|

202人浏览过

|

来源于php中文网

原创

实现单选列表项:使用事件委托与动态类控制

本文详解如何在动态生成的 列表中实现「单选高亮」效果——点击任一列表项时,仅该元素添加 .active 类,其余自动移除,避免多选冲突,适用于预约系统、人员选择等场景。

本文详解如何在动态生成的 `

  • ` 列表中实现「单选高亮」效果——点击任一列表项时,仅该元素添加 `.active` 类,其余自动移除,避免多选冲突,适用于预约系统、人员选择等场景。

    在构建如测试预约系统这类交互式前端应用时,常需让用户从多个选项(如医生/工作人员列表)中单选一项,并实时反馈视觉状态(例如加粗边框、背景色变化)。若直接为每个

  • 绑定独立事件监听器,不仅性能低下,更难以统一管理选中状态;而原代码中循环绑定 + 手动 classList.toggle() 的方式,会导致多选残留,无法满足“仅一个激活”的核心需求。

    ✅ 正确解法:事件委托 + 状态归一化

    推荐采用 事件委托(Event Delegation) ——仅在父容器(如

      )上绑定一次监听器,利用事件冒泡机制捕获子元素点击,再通过 closest() 定位目标
    • ,最后批量清理旧状态、设置新状态。这种方式高效、可维护,且天然适配动态插入的 DOM 元素。

      1. 优化 HTML 渲染逻辑

      避免在循环中反复操作 innerHTML(会重绘整个列表),改用 map() 生成 HTML 字符串数组,再一次性插入:

      灵枢SparkVertex
      灵枢SparkVertex

      零代码AI应用开发平台

      下载
      const staff = [
        { id: 1, name: "Alex Rosetta", email: "...", image: "https://i.ibb.co/..." },
        { id: 2, name: "Maria July",  email: "...", image: "https://i.ibb.co/..." }
      ];
      
      function generateListHTML(data) {
        return data.map(({ id, name, email, image }) => `
          <li class="repoFolder" data-value="${id}">
            <div class="doc-photo">
              <img src="${image}" alt="Photo of ${name}" />
            </div>
            <div class="doc-infos">
              <p class="name">${name}</p>
              <p class="mail">${email}</p>
            </div>
          </li>
        `).join('');
      }
      
      const list = document.querySelector('ul.myUl');
      list.insertAdjacentHTML('beforeend', generateListHTML(staff));

      ⚠️ 注意:insertAdjacentHTML 比 innerHTML += 更安全高效,避免重复解析与重排。

      2. 绑定单点监听器,实现单选逻辑

      // 仅监听 ul,不遍历每个 li
      list.addEventListener('click', (e) => {
        // 确保点击目标是 li 或其内部元素
        const clickedLi = e.target.closest('li.repoFolder');
        if (!clickedLi) return;
      
        // 移除所有 li 的 active 类(归一化状态)
        list.querySelectorAll('li.repoFolder').forEach(li => {
          li.classList.remove('active');
        });
      
        // 仅给当前点击项添加 active 类
        clickedLi.classList.add('active');
      });

      3. 配套 CSS 样式(示例)

      .myUl {
        list-style: none;
        padding: 0;
      }
      .repoFolder {
        border: 2px solid #ddd;
        border-radius: 8px;
        margin-bottom: 12px;
        cursor: pointer;
        transition: border-color 0.2s, box-shadow 0.2s;
      }
      .repoFolder.active {
        border-color: #4285f4;
        box-shadow: 0 0 0 3px rgba(66, 133, 244, 0.2);
      }

      ? 关键要点总结

      • 不要为每个
      • 单独绑定 onclick
      • :易造成内存泄漏、状态不同步;
      • 避免 querySelector(".myUl li") 返回首个元素:它只匹配第一个,无法批量操作;
      • 优先使用 closest() 而非 parentNode:更健壮,能穿透多层嵌套(如点击 实现单选列表项:使用事件委托与动态类控制 也能定位到外层
      • );
      • CSS 中建议使用 transition:让边框/背景变化更平滑,提升用户体验;
      • data-value 属性仍可安全读取:clickedLi.dataset.value 可获取 ID,用于后续提交逻辑。

      通过以上结构化实现,你将获得一个高性能、易扩展、符合现代 Web 开发规范的单选列表组件——无论初始渲染还是后续动态追加人员,均无需修改交互逻辑。

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

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    658

    2023.08.03

    js截取字符串的方法
    js截取字符串的方法

    js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

    219

    2023.09.04

    java基础知识汇总
    java基础知识汇总

    java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

    1560

    2023.10.24

    字符串介绍
    字符串介绍

    字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

    645

    2023.11.24

    java读取文件转成字符串的方法
    java读取文件转成字符串的方法

    Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

    1088

    2024.03.22

    php中定义字符串的方式
    php中定义字符串的方式

    php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

    1042

    2024.04.29

    go语言字符串相关教程
    go语言字符串相关教程

    本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

    186

    2025.07.29

    c++字符串相关教程
    c++字符串相关教程

    本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

    90

    2025.08.07

    Golang 测试体系与代码质量保障:工程级可靠性建设
    Golang 测试体系与代码质量保障:工程级可靠性建设

    Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

    24

    2026.02.28

    热门下载

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

    精品课程

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

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