新闻中心

动态待办事项列表:J*aScript实现点击完成按钮切换列表项背景色

2025-11-12
浏览次数:
返回列表

动态待办事项列表:JavaScript实现点击完成按钮切换列表项背景色

本教程将指导您如何使用纯j*ascript为动态生成的待办事项列表实现点击“完成”按钮时切换列表项背景色的功能。核心在于避免id重复问题,并通过事件处理函数传递当前元素引用 (`this`),利用dom父节点属性精准定位并修改目标列表项的样式,从而实现精确的元素操作。

在构建交互式Web应用时,动态生成内容并对其进行样式修改是常见的需求。例如,在一个待办事项列表中,我们希望用户点击“完成”按钮后,对应的待办事项能够高亮显示,以区分已完成和未完成的任务。然而,在实现这类功能时,开发者常常会遇到一个常见陷阱:使用重复的HTML id 属性来定位元素。

避免ID重复的陷阱与精准元素定位

HTML规范明确指出,id 属性在整个文档中必须是唯一的。当您使用 document.getElementById() 方法来获取元素时,它只会返回文档中第一个匹配指定ID的元素。这意味着,如果您动态生成了多个

  • 元素,并给它们都赋予了相同的 id="item",那么 document.getElementById('item') 将永远只选中第一个
  • 元素,导致其他列表项的样式无法被修改。

    为了解决这个问题,我们需要摒弃依赖重复ID的错误做法,转而采用更精确的DOM操作技巧:

    1. 不为动态生成的元素分配重复ID。
    2. 利用事件触发时的上下文信息。 当一个按钮被点击时,该事件的上下文(即 this 关键字)会指向被点击的按钮本身。我们可以将这个 this 传递给事件处理函数。
    3. 通过DOM遍历定位目标元素。 一旦我们获得了被点击的按钮元素,就可以利用DOM的父子关系(如 parentNode)来向上追溯,找到其对应的父级
    4. 元素,进而修改其样式。

    实现步骤与代码示例

    下面我们将通过一个简单的待办事项列表示例,详细演示如何实现点击“完成”按钮后,切换对应列表项背景色的功能。

    1. HTML 结构

    首先,我们构建一个基本的HTML结构,包含一个输入框用于添加任务,一个按钮用于提交,以及一个无序列表

    Tanka Tanka

    具备AI长期记忆的下一代团队协作沟通工具

    Tanka 146 查看详情 Tanka
      来显示待办事项。
      <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Get Stuff Done</title>
        <link rel="stylesheet" href="todo.css" type="text/css">
      </head>
      <body>
        <div class="container">
          <header>
            <p>
              <h1 id="title">Todo list</h1>
              <h2 id="date"></h2>
            </p>
            <form name="myForm" method="post" action="">
              <input type="text" id="add" name="addNew">
              <button name="sumbitBtn" type="button" class="addBtn" onclick="addItem()">add</button>
              <div>
                <ul id="unList">
                </ul>
              </div>
            </form>
          </header>
        </div>
      
        <script type="text/j*ascript">
          // J*aScript 代码将在这里
        </script>
      </body>
      </html>

      2. J*aScript 核心逻辑

      我们将把J*aScript代码直接嵌入到HTML文件的 <script> 标签中,方便演示。</script>

      const list = []; // 用于存储待办事项的数组
      
      /**
       * 添加待办事项到列表
       */
      function addItem() {
        const taskInput = document.getElementById('add');
        const task = taskInput.value.trim(); // 获取输入值并去除首尾空格
      
        if (task === '') {
          alert('待办事项不能为空!');
          return;
        }
      
        list.push(task); // 将任务添加到数组
      
        // 获取无序列表元素
        const unList = document.getElementById('unList');
      
        // 动态创建列表项,并为“完成”按钮绑定事件
        // 注意:不再给<li>设置重复ID
        unList.innerHTML += `
          <li>
            ${task} 
            <button type='button' onclick='changeBackgroundColor(this)'>done</button>
          </li>`;
      
        taskInput.value = ''; // 清空输入框
      }
      
      /**
       * 改变列表项的背景颜色
       * @param {HTMLElement} element 被点击的“完成”按钮元素
       */
      function changeBackgroundColor(element) {
        // element 参数就是被点击的按钮(因为我们在onclick中传递了this)
        // element.parentNode 获取按钮的直接父元素,即对应的 <li>
        element.parentNode.style.backgroundColor = 'green'; 
        // 也可以选择禁用按钮,表示已完成
        element.disabled = true; 
        element.textContent = 'Done!'; // 改变按钮文本
      }

      代码解析:

      • addItem() 函数:
        • 获取输入框的值,并进行非空校验。
        • 使用模板字符串 (`) 动态生成
        • 元素及其内部的文本和“完成”按钮。
        • 关键在于 onclick='changeBackgroundColor(this)':当这个“完成”按钮被点击时,它会调用 changeBackgroundColor 函数,并将 this(即当前被点击的按钮元素本身)作为参数传递过去。
      • changeBackgroundColor(element) 函数:
        • 它接收一个参数 element,这个 element 就是从 onclick 事件中传递过来的被点击的按钮。
        • element.parentNode 是DOM操作中非常实用的一个属性,它返回指定元素的直接父元素。在这里,被点击的按钮的父元素就是我们想要改变背景色的
        • 元素。
        • 通过 element.parentNode.style.backgroundColor = 'green';,我们就可以精确地将对应
        • 元素的背景色设置为绿色。
        • 为了更好的用户体验,我们还禁用了按钮并修改了其文本。

      完整示例代码

      将上述HTML和J*aScript代码整合,您将得到一个功能完善的待办事项列表。

      <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Get Stuff Done</title>
        <!-- 您可以在这里链接外部CSS文件,例如 todo.css -->
        <style>
          body { font-family: sans-serif; margin: 20px; background-color: #f4f4f4; }
          .container { max-width: 600px; margin: 0 auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
          h1 { text-align: center; color: #333; }
          form { display: flex; margin-bottom: 20px; }
          #add { flex-grow: 1; padding: 10px; border: 1px solid #ddd; border-radius: 4px 0 0 4px; font-size: 16px; }
          .addBtn { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 0 4px 4px 0; cursor: pointer; font-size: 16px; }
          .addBtn:hover { background-color: #0056b3; }
          ul { list-style: none; padding: 0; }
          li { display: flex; justify-content: space-between; align-items: center; padding: 12px 15px; margin-bottom: 8px; background-color: #f9f9f9; border: 1px solid #eee; border-radius: 4px; transition: background-color 0.3s ease; }
          li button { padding: 8px 12px; background-color: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }
          li button:hover { background-color: #218838; }
          li button:disabled { background-color: #6c757d; cursor: not-allowed; }
        </style>
      </head>
      <body>
        <div class="container">
          <header>
            <p>
              <h1 id="title">Todo list</h1>
              <h2 id="date"></h2>
            </p>
            <form name="myForm" method="post" action="">
              <input type="text" id="add" name="addNew" placeholder="添加新任务...">
              <button name="sumbitBtn" type="button" class="addBtn" onclick="addItem()">add</button>
              <div>
                <ul id="unList">
                </ul>
              </div>
            </form>
          </header>
        </div>
      
        <script type="text/j*ascript">
        const list = [];
      
        function addItem() { 
          const taskInput = document.getElementById('add');
          const task = taskInput.value.trim(); 
      
          if (task === '') {
            alert('待办事项不能为空!');
            return;
          }
      
          list.push(task); 
          const unList = document.getElementById('unList');
          unList.innerHTML += `
            <li> 
              ${task} 
              <button type='button' onclick='changeBackgroundColor(this)'>done</button>
            </li>`;
          taskInput.value = '';
        } 
      
        function changeBackgroundColor(element) { 
           element.parentNode.style.backgroundColor = '#d4edda'; /* 浅绿色 */
           element.disabled = true;
           element.textContent = 'Done!';
           element.style.backgroundColor = '#28a745'; /* 按钮自身颜色 */
        }
        </script>
      </body>
      </html>

      注意事项与最佳实践

    1. ID的唯一性: 再次强调,id 属性在HTML文档中必须是唯一的。对于需要动态操作的元素,如果无法保证ID的唯一性,应避免使用 document.getElementById()。
    2. DOM遍历的灵活性: 除了 parentNode,DOM还提供了 children、firstElementChild、lastElementChild、nextElementSibling、previousElementSibling 等属性,以及 closest()、querySelector() 等方法,可以帮助您在DOM树中灵活定位目标元素。
    3. 事件委托 (Event Delegation): 对于包含大量动态生成元素的列表,为每个元素单独绑定事件监听器可能会影响性能。更高效的做法是使用事件委托,即在父元素上绑定一个事件监听器,然后通过事件冒泡和 event.target 来判断是哪个子元素触发了事件。
    4. 样式与行为分离: 直接通过 element.style.propertyName 修改样式虽然直接,但在大型项目中,推荐通过添加或移除CSS类名的方式来改变元素样式。例如,可以定义一个 .completed 类,包含绿色的背景色,然后在 changeBackgroundColor 函数中通过 element.parentNode.classList.add('completed') 来添加这个类。这有助于保持CSS和J*aScript代码的整洁和可维护性。

    总结

    本教程详细讲解了如何在J*aScript中实现动态待办事项列表的背景色切换功能。核心在于理解 id 属性的唯一性原则,并掌握如何利用 this 关键字和 parentNode 属性进行精确的DOM操作。通过避免ID重复和采用正确的元素定位策略,您可以有效地管理和操作动态生成的Web页面内容,从而构建出更健壮、更具交互性的用户界面。

  • 以上就是动态待办事项列表:J*aScript实现点击完成按钮切换列表项背景色的详细内容,更多请关注其它相关文章!


    # 第一个  # 六安小视频推广招聘网站  # seo市场价  # 网站建设演示ppt模板下载  # 网络软文推广网站有哪些  # 百度seo优化指  # seo成功案例100例  # 雅安seo外包  # 二季度营销推广方案范文  # 网络自媒体营销推广方式  # SEO优化诊断在线  # 自定义  # 弹出  # 您可以  # 遍历  # css  # 输入框  # 如何实现  # 在这里  # 绑定  # 背景色  # html文件  # ai  # ssl  # 事件冒泡  # edge  # node  # html  # java  # javascript 


    相关栏目: 【 科技资讯46185 】 【 网络学院92790


    相关推荐: 2026年CSGO开箱网站推荐 CSGO开箱平台精选  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  Lar*el递归关系中排除子孙节点的策略  4399免费游戏网址入口 4399小游戏免费入口点开即玩  2026春节假期时间安排 2026春节假日查询  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  批改网学生版PC登录 批改网官网登录系统入口  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  163邮箱官方主页登录 直达网易邮箱登录核心页面  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  J*aScript生成器_j*ascript异步迭代  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  AO3最新官网入口公告_2025AO3镜像站实时查询方法  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  Bing引擎入口最新2025 Bing搜索免费官方登录  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  Golang如何使用const iota_Go iota常量计数器讲解  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  SteamMachine定价或为699美元 大家想入手吗?  composer的"require-dev"部分是用来做什么的?  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  深入理解J*a链表中的IPosition接口与使用  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Pygame教程:解决用户输入与游戏状态更新不同步问题  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  如何在 Windows 11 中启动游戏手柄设置  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  优化大型XML文件解析:基于Python流式处理的内存高效方案  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  J*aScript map 迭代中检测空数组元素的有效方法  J*a递归快速排序中静态变量导致数据累积问题的解决方案  mc.js免安装版 mc.js一键畅玩入口  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  126邮箱网页版官方入口 126邮箱账号在线登录平台  探索高级语言到原生C/C++的转译:挑战与内存管理策略 

    搜索