JavaScript待办列表:实现点击“完成”按钮切换列表项背景色的正确方法

JavaScript待办列表:实现点击“完成”按钮切换列表项背景色的正确方法

本教程旨在解决javascript待办事项列表中,动态生成列表项后点击“完成”按钮无法正确切换对应背景色的问题。文章将解释为何避免重复使用id,并提供一种高效且符合最佳实践的解决方案。通过将触发事件的按钮元素作为参数传递,并利用dom遍历来精准定位并修改父级列表项的样式,从而实现每个待办事项的独立状态控制。

在构建交互式Web应用时,尤其是涉及动态生成内容的场景,我们经常需要对特定元素进行样式操作。一个常见的需求是在待办事项列表中,当用户点击某个事项旁边的“完成”按钮时,该事项的背景色能够随之改变。然而,初学者在尝试实现这一功能时,可能会遇到一个问题:只有第一个动态生成的列表项能够响应样式变化,而后续的列表项则无效。这通常是由于对HTML ID属性的误解和不当使用所导致的。

问题根源:ID的唯一性原则

HTML中的 id 属性旨在为文档中的每个元素提供一个唯一的标识符。当我们在JavaScript中使用 document.getElementById(‘someId’) 方法时,浏览器会从文档顶部开始查找,并返回第一个匹配该ID的元素。如果文档中存在多个相同的ID,getElementById 仍然只会返回第一个,导致其他具有相同ID的元素无法被正确选中和操作。

在原始实现中,问题可能出在动态生成列表项时,为每个

或其内部的某个元素赋予了相同的 id=’item’。当 change() 函数尝试通过 document.getElementById(‘item’) 来获取元素时,它总是指向第一个被创建的 ,因此只有第一个列表项的背景色会发生变化。

解决方案:利用 this 关键字和DOM遍历

要解决这个问题,我们需要确保每个“完成”按钮能够准确地指向其所属的列表项。一种简洁而有效的方法是利用JavaScript事件处理中的 this 关键字,并结合DOM(文档对象模型)的遍历能力。

立即学习“Java免费学习笔记(深入)”;

当一个事件处理函数被调用时,this 关键字通常指向触发该事件的元素。我们可以将 this 作为参数传递给事件处理函数,从而获取到被点击的按钮元素本身。一旦我们有了按钮元素,就可以通过其 parentNode 属性访问其直接父元素,即包裹着按钮的

标签。

下面是优化后的HTML结构和JavaScript代码示例:

        Get Stuff Done        const list = [];    // 添加待办事项    function addItem() {       const taskInput = document.getElementById('add');      const task = taskInput.value.trim(); // 获取并去除前后空格      if (task === "") { // 避免添加空任务        alert("任务内容不能为空!");        return;      }      list.push(task);       // 使用模板字符串创建新的列表项,并绑定点击事件      document.getElementById('unList').innerHTML += `        
  • ${task}
  • `; taskInput.value = ''; // 清空输入框 } // 切换列表项背景色 function change(element) { // element 是被点击的按钮,element.parentNode 则是其父元素
  • element.parentNode.style.backgroundColor = 'green'; // 更好的实践是添加/移除CSS类,例如: // element.parentNode.classList.add('completed'); }

    Todo list

  • 代码解析

    addItem() 函数的改进:

    任务校验与清空: 增加了对空任务的检查 (task.trim() === “”),并清空了输入框 (taskInput.value = ”),以提升用户体验。模板字符串与正确结构: 使用了JavaScript的模板字符串(反引号 `),这使得动态生成包含多行HTML和变量的字符串变得更加简洁和可读。 标签的正确包裹: 确保每个新添加的任务都被一个 标签正确包裹。这是关键,因为我们希望改变的是整个列表项的背景色。onclick=’change(this)’: 这是核心改动。在“done”按钮的 onclick 事件中,我们不再尝试通过ID来查找元素,而是直接将按钮元素自身 (this) 作为参数传递给 change 函数。

    change(element) 函数:

    接收元素参数: change 函数现在接收一个名为 element 的参数,这个参数就是被点击的“done”按钮。element.parentNode: 通过 element.parentNode,我们可以获取到 element(即按钮)的直接父元素,在这个例子中,就是包裹着按钮的 标签。style.backgroundColor = ‘green’: 最后,我们直接修改 元素的 style.backgroundColor 属性,将其设置为绿色。

    通过这种方式,每次点击“完成”按钮时,change 函数都能准确地操作到其对应的

    元素,从而实现每个待办事项的独立样式控制。

    注意事项与最佳实践

    ID的唯一性: 再次强调,id 属性在HTML文档中必须是唯一的。如果需要选择多个元素,应使用类名(class)并结合 document.getElementsByClassName() 或 document.querySelectorAll()。DOM操作效率: 频繁地使用 innerHTML += 来添加大量DOM元素可能会影响性能,因为它会重新解析整个字符串并重建DOM。对于更复杂的动态列表,考虑使用 document.createElement()、appendChild() 等方法来更精细地操作DOM,或者利用现代前端框架(如React, Vue, Angular)来高效管理UI更新。样式管理: 直接修改 element.style.backgroundColor 适用于简单场景。在实际项目中,更推荐通过添加/移除CSS类来管理元素的样式,例如 element.parentNode.classList.add(‘completed’) 和 element.parentNode.classList.remove(‘completed’)。这样可以将样式定义与JavaScript逻辑分离,提高代码的可维护性。事件委托: 对于大量动态生成的元素,为每个元素绑定事件监听器可能会消耗较多资源。一种更优化的方案是使用事件委托(Event Delegation),即在它们的共同父元素上绑定一个事件监听器,然后通过 event.target 判断是哪个子元素触发了事件。这可以减少内存占用并简化事件管理。

    总结

    本文详细阐述了在JavaScript待办事项列表中,如何正确实现点击“完成”按钮切换对应列表项背景色的功能。核心在于理解HTML id 属性的唯一性,并巧妙地利用 this 关键字以及DOM遍历(parentNode)来精准定位和操作目标元素。通过遵循这些最佳实践,开发者可以构建出更健壮、可维护且用户体验良好的动态Web应用。

    以上就是JavaScript待办列表:实现点击“完成”按钮切换列表项背景色的正确方法的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1538506.html

    赞 (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    JavaScript 中 window.onerror 拦截的陷阱与最佳实践
    上一篇 2025年12月21日 05:03:23
    Mongoose中将_id字段设置为数字类型并实现自动递增序列号
    下一篇 2025年12月21日 05:03:36

    相关推荐

    • Java在Windows CMD终端实现ANSI颜色输出的策略与实践

      Java在Windows CMD终端实现ANSI颜色输出的策略与实践Java在Windows CMD终端实现ANSI颜色输出的策略与实践Java在Windows CMD终端实现ANSI颜色输出的策略与实践Java在Windows CMD终端实现ANSI颜色输出的策略与实践

      本文深入探讨了Java程序在Windows CMD终端中无法正确显示ANSI颜色代码的问题,并提供了两种有效的解决方案。针对不同Java版本和需求,我们介绍了通过外部命令(如echo)代理输出的兼容性方法,以及利用Java 22+ Foreign Function & Memory API直…

      2026年9月27日 • 用户投稿
      000
    • Excel批量转换日期格式技巧

      Excel批量转换日期格式技巧Excel批量转换日期格式技巧Excel批量转换日期格式技巧Excel批量转换日期格式技巧

      1、 null 2、 选取需要调整格式的日期内容。 3、 使用鼠标选中需转换格式的日期区域,支持多区域同时选择。 4、 弹出列分割设置界面。 5、 点击菜单栏中的“数据”选项,选择“分列”,启动文本分列向导窗口。 6、 设置分列方式为固定宽度模式。 7、 勾选“固定宽度”单选按钮,然后点击“下一步”…

      2026年9月27日 • 用户投稿
      000
    • 解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

      解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

      本文旨在解决在Spring Boot后端(AWS EC2)和React前端(AWS S3)部署时,即使服务器端已配置宽松的CORS策略,仍出现跨域资源共享(CORS)错误的问题。我们将深入探讨常见误区,并提供一个将CORS配置与Spring Security有效整合的专业解决方案,同时强调处理wit…

      2026年9月27日 • 用户投稿
      100
    • 铁路12306怎么激活会员_铁路12306会员激活方式

      铁路12306怎么激活会员_铁路12306会员激活方式铁路12306怎么激活会员_铁路12306会员激活方式铁路12306怎么激活会员_铁路12306会员激活方式铁路12306怎么激活会员_铁路12306会员激活方式

      先激活铁路畅行会员账户才能享受购票优惠或兑换车票。可通过12306 App在线激活,进入“铁路会员”页面,选择“在线激活”,完成人脸识别和协议确认;若失败,可持身份证至车站自助机或服务窗口,选择“会员激活”,输入交易密码完成激活。 如果您想通过积分累积来享受购票优惠或免费兑换车票,但尚未开通相关权益…

      2026年9月27日 • 用户投稿
      000
    • 在Java中实现ANSI颜色输出:解决CMD终端兼容性问题

      在Java中实现ANSI颜色输出:解决CMD终端兼容性问题在Java中实现ANSI颜色输出:解决CMD终端兼容性问题在Java中实现ANSI颜色输出:解决CMD终端兼容性问题在Java中实现ANSI颜色输出:解决CMD终端兼容性问题

      本文深入探讨了Java程序在Windows CMD终端中无法正确显示ANSI颜色代码的原因,并提供了两种有效的解决方案。首先,介绍通过外部命令cmd /c echo实现跨版本兼容的着色输出;其次,针对Java 22及更高版本,详细讲解如何利用Foreign Function & Memory…

      2026年9月27日 • 用户投稿
      000
    • sublime怎么快速注释代码_Sublime Text单行与多行代码注释快捷键

      sublime怎么快速注释代码_Sublime Text单行与多行代码注释快捷键sublime怎么快速注释代码_Sublime Text单行与多行代码注释快捷键sublime怎么快速注释代码_Sublime Text单行与多行代码注释快捷键sublime怎么快速注释代码_Sublime Text单行与多行代码注释快捷键

      使用 Ctrl/Cmd + / 可快速实现单行或多行注释,选中代码后再次按键取消注释,部分语言支持通过插件或手动输入实现块注释,提升编码效率。 在 Sublime Text 中快速注释代码非常方便,支持单行和多行的注释操作,提升编码效率。 单行注释快捷键 将光标放在需要注释的行,使用以下快捷键: W…

      2026年9月27日 • 用户投稿
      000
    • 谷歌浏览器怎么让网页自动刷新_谷歌浏览器设置页面定时刷新方法

      可通过安装Chrome扩展实现网页自动刷新。首先在扩展管理页进入Chrome网上应用店,搜索ChromeReloader、ChromeReloadPlus或Auto Refresh Plus插件并安装;随后点击插件图标设置刷新间隔,如5秒至30分钟内选择或自定义时间,启用后页面将按设定周期自动重载,…

      2026年9月27日
      100
    • Java语法基础中++i和i++的区别

      答案:++i是先加后用,i++是先用后加。前者先将i加1再参与运算,后者先使用原值再加1,两者在赋值和表达式中结果不同。 在Java语法中,++i 和 i++ 都是自增操作符,作用是将变量 i 的值加1,但它们在使用时的执行时机和返回值有重要区别。 1. ++i(前置自增) 前置自增表示先将变量 i…

      2026年9月27日
      000
    • 猫眼如何举报不当评论内容_猫眼不当评论举报处理流程

      猫眼如何举报不当评论内容_猫眼不当评论举报处理流程猫眼如何举报不当评论内容_猫眼不当评论举报处理流程猫眼如何举报不当评论内容_猫眼不当评论举报处理流程猫眼如何举报不当评论内容_猫眼不当评论举报处理流程

      发现不当评论可举报,通过猫眼App内功能直接投诉,选择举报原因并提交;若无效可联系客服人工申诉并提供证据;也可通过官网提交反馈,上传截图与说明。 如果您在猫眼平台发现不当评论内容,可能会影响其他用户的观影决策或包含违规信息,可以通过以下流程进行举报。举报成功后,平台将根据规则对内容进行审核与处理。 …

      2026年9月27日 • 用户投稿
      100
    • sublime怎么配置build system_Sublime Text自定义编译系统教程

      sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程

      首先配置Sublime Text的编译系统以运行代码,依次点击Tools → Build System → New Build System…,编辑JSON模板,例如为Python设置{ “cmd”: [“python”, “-u&#822…

      2026年9月27日 • 用户投稿
      000
    • 详解抖音平台订单导出的具体步骤

      详解抖音平台订单导出的具体步骤详解抖音平台订单导出的具体步骤详解抖音平台订单导出的具体步骤详解抖音平台订单导出的具体步骤

      随着电商行业的不断壮大,抖音已逐渐成为众多电商从业者不可或缺的运营阵地。在日常经营中,订单导出是一项极为关键的操作,能够帮助商家高效整理交易数据,优化发货流程,并提升客户服务体验。本文将从多个方面深入介绍如何在抖音平台完成订单导出操作。 1. 登录抖音商家后台 首先需进入抖音商家后台系统。打开抖音A…

      2026年9月27日 • 用户投稿
      000
    • 音频剪辑入门:简单几步学会

      音频剪辑入门:简单几步学会音频剪辑入门:简单几步学会音频剪辑入门:简单几步学会音频剪辑入门:简单几步学会

      日常生活中,我们常常需要对音频或音乐进行剪辑处理,比如截取一段喜欢的旋律作为手机铃声,或将多首歌曲的精彩段落拼接成一首串烧音乐。使用风云音频处理大师,可以轻松实现音频的裁剪与合并。接下来将详细介绍操作流程,帮助你快速上手,制作专属的个性化音频内容。 1、 在开始音频编辑之前,需准备合适的工具。首先在…

      2026年9月27日 • 用户投稿
      300
    • Safari浏览器无痕模式怎么开启_Safari浏览器隐私浏览模式开启方式

      Safari浏览器无痕模式怎么开启_Safari浏览器隐私浏览模式开启方式Safari浏览器无痕模式怎么开启_Safari浏览器隐私浏览模式开启方式Safari浏览器无痕模式怎么开启_Safari浏览器隐私浏览模式开启方式Safari浏览器无痕模式怎么开启_Safari浏览器隐私浏览模式开启方式

      首先在Safari中点击标签页图标,再点右上角箭头选择“无痕浏览”即可开启;完成浏览后,点击左上角“常规”按钮可切回普通模式;iPad用户还可长按Safari图标,从快捷菜单选择“新无痕浏览窗口”直接启动。 如果您希望在浏览网页时防止Safari保存历史记录、搜索记录或表单数据,可以启用无痕模式来保…

      2026年9月27日 • 用户投稿
      000
    • 使用 Gson 和 Kotlin 泛型将数据转换为自定义类

      使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类

      本文旨在解决在使用 Kotlin 和 Gson 库时,将 JSON 数据反序列化为自定义类,特别是涉及到泛型和 reified 类型参数时可能遇到的问题。核心问题在于类型擦除会导致 Gson 无法正确识别目标类型,从而产生 ClassCastException。本文将深入探讨问题的原因,并提供多种解…

      2026年9月27日 • 用户投稿
      200
    • 用Pygal绘制正割函数图像

      用Pygal绘制正割函数图像用Pygal绘制正割函数图像用Pygal绘制正割函数图像用Pygal绘制正割函数图像

      python是一种极具趣味性的编程语言,具备在命令行中直接运行的能力。它内置了众多强大且实用的模块,本文将带你深入了解如何借助这些模块有效提升编程效率与实际操作能力。 1、 同时按下键盘上的Win键与R键,打开“运行”对话框。输入cmd并回车,即可进入Windows系统的命令行环境。 2、 在命令提…

      2026年9月27日 • 用户投稿
      100
    • 华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相

      华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相

      2025年9月24日,华为watch gt 6系列在线上举行的华为穿戴音频新品发布会正式亮相,再次彰显华为在高端智能手表市场的强劲竞争力。 自2018年首代产品问世以来,GT系列始终聚焦长续航、健康监测与运动进阶功能,持续引领智能穿戴创新方向。市场研究机构IDC最新数据显示,2025年第二季度,华为…

      2026年9月27日 • 用户投稿
      200
    • sublime怎么查看当前文件的scope_sublime当前文件Scope查看方法

      sublime怎么查看当前文件的scope_sublime当前文件Scope查看方法sublime怎么查看当前文件的scope_sublime当前文件Scope查看方法sublime怎么查看当前文件的scope_sublime当前文件Scope查看方法sublime怎么查看当前文件的scope_sublime当前文件Scope查看方法

      使用“Show Scope Name”命令可查看Sublime Text中光标位置的语法作用域,通过Ctrl+Shift+P输入命令或菜单Tools→Developer→Show Scope Name打开,显示如source.python等层级信息,用于调试语法高亮和主题配色。 在 Sublime …

      2026年9月27日 • 用户投稿
      100
    • 详解:如何将抖音订单接口接入到小程序上

      详解:如何将抖音订单接口接入到小程序上详解:如何将抖音订单接口接入到小程序上详解:如何将抖音订单接口接入到小程序上详解:如何将抖音订单接口接入到小程序上

      前言 作为全球领先的短视频平台,抖音拥有庞大的用户群体和活跃的电商生态。与此同时,小程序凭借其轻便、即用即走的特性,成为移动应用的重要形态之一。本文将深入讲解如何将抖音的订单接口成功接入小程序,助力开发者融合两大平台优势,提升服务体验与商业转化能力。 步骤一:理解抖音订单接口与小程序基础 在实际接入…

      2026年9月27日 • 用户投稿
      100
    • 360极速浏览器怎么把网页保存为图片_360极速浏览器网页长截图与另存为图片功能

      360极速浏览器怎么把网页保存为图片_360极速浏览器网页长截图与另存为图片功能360极速浏览器怎么把网页保存为图片_360极速浏览器网页长截图与另存为图片功能360极速浏览器怎么把网页保存为图片_360极速浏览器网页长截图与另存为图片功能360极速浏览器怎么把网页保存为图片_360极速浏览器网页长截图与另存为图片功能

      首先使用360极速浏览器内置长截图功能,点击菜单中“网页截图”选择“长截图”自动捕获全页并保存为PNG;其次可右键查看是否有“将页面另存为图片”选项直接导出JPEG或PNG格式;最后当功能受限时,通过扩展中心安装“FireShot”等插件实现高清全页截图并下载。 如果您希望将浏览的网页完整保存为图片…

      2026年9月27日 • 用户投稿
      100
    • 抖音店铺订单信息加密解密技巧

      抖音店铺订单信息加密解密技巧抖音店铺订单信息加密解密技巧抖音店铺订单信息加密解密技巧抖音店铺订单信息加密解密技巧

      随着电商行业的迅猛发展,越来越多的商家入驻抖音平台开设线上店铺。然而,在处理订单数据时,由于抖音平台对订单信息进行了加密保护,不少商家在获取和解析订单内容时面临挑战。本文将从多个维度深入解析抖音店铺订单信息的加密与解密方法,助力商家高效处理订单数据,提升整体运营效率。 抖音店铺订单信息的加密机制 抖…

      2026年9月27日 • 用户投稿
      100

    发表回复

    登录后才能评论
    关注微信