news 2026/6/3 0:40:11

22.任务清单应用开发实战:从HTML结构到JavaScript交互的完整实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
22.任务清单应用开发实战:从HTML结构到JavaScript交互的完整实现

目录

一、项目概述

二、HTML结构设计

三、CSS样式设置

四、JavaScript功能实现

1. 调试与基础准备

2. 新建任务功能

3. 删除任务功能

4. 任务状态切换功能

五、完整代码整合

六、总结


一、项目概述

本文将带你一步步实现一个简单的任务清单(Todo List)应用,包含新建任务、标记完成、删除任务等核心功能。通过本案例,你将掌握DOM操作、事件绑定以及CSS布局的综合运用。

二、HTML结构设计

首先搭建基础的页面结构,分为导航栏(nav)和容器(container)两部分,容器包含未完成(todo)和已完成(done)两个区域。

<body> <div class="nav"> <input type="text"><button>新建任务</button> </div> <div class="container"> <div class="todo"> <h3>未完成</h3> <input type="checkbox" name="" id=""> <span>吃饭</span><button>删除</button> </div> <div class="done"> <h3>已完成</h3> </div> </div> </body>

三、CSS样式设置

使用CSS进行页面美化,包括居中布局、按钮样式、颜色搭配等。

<style> * { margin: 0px; padding: 0px; box-sizing: border-box; } .nav { width: 800px; height: 100px; margin: 0 auto; display: flex; align-items: center; } .nav input { width: 600px; height: 60px; border-radius: 5px; } .nav button { width: 200px; height: 60px; background-color: orange; color: white; font-size: 20px; border: orange; border-radius: 5px; } .nav button:active { background-color: grey; } .container { width: 800px; display: flex; margin: 0px auto; } h3 { background-color: gray; color: white; text-align: center; width: 400px; height: 60px; padding-top: 15px; } .todo, .done { width: 50%; height: 100%; } .row { width: 400px; display: flex; align-items: center; } span { width: 200px; font-size: 20px; margin-left: 5px; } .row button { width: 90px; height: 40px; font-size: 20px; margin-top: 10px; } </style>

四、JavaScript功能实现

1. 调试与基础准备

首先获取新建任务按钮并进行调试查看属性:

let new_job_button = document.querySelector('.nav button') console.dir(new_job_button) // 调试代码看属性

2. 新建任务功能

实现newJob函数,处理输入验证、创建新任务元素并添加到未完成列表:

<script> function newJob() { // 获取到input输入框按钮 let input = document.querySelector('.nav input') // 获取到输入的信息 let input_info = input.value if(input_info == '') { return } console.log(input_info) // 获取到todo这个div let todo = document.querySelector('.todo') // 创建一个div let div = document.createElement('div') // 创建一个checkbox let checkbox = document.createElement('input') checkbox.type = 'checkbox' // 创建一个span(文本内容是刚才输入的信息对应的文本) let span = document.createElement('span') span.innerHTML = input_info console.log(checkbox) console.log(span) // 创建一个删除button let button = document.createElement('button') button.innerHTML = "删除" div.appendChild(checkbox) div.appendChild(span) div.appendChild(button) console.log(div) // 更新样式 div.className = 'row' // 将div插入到todo这个div中 todo.appendChild(div) let delete_buttons = document.querySelectorAll('.row button') console.log(delete_buttons) } </script>

3. 删除任务功能

为每个删除按钮绑定点击事件,实现任务项的移除:

let delete_buttons = document.querySelectorAll('.row button') console.log(delete_buttons) for(i = 0; i < delete_buttons.length; i++) { delete_buttons[i].onclick = function() { let parent = this.parentNode; console.log(parent) let grand_parent = parent.parentNode console.log(grand_parent) grand_parent.removeChild(parent) } }

4. 任务状态切换功能

通过复选框实现任务在"未完成"和"已完成"之间的移动:

let checkbox_buttons = document.querySelectorAll('.row input') for(i = 0; i < checkbox_buttons.length; i++) { checkbox_buttons[i].onclick = function() { // 将节点插入到对应的div中 // row代表的插入的节点 let row = this.parentNode; // target代表的是对row插入到那个div中 // 如果复选框已经被选中,那么target就是已完成对应的这个div // 否则target就是未完成对应的div let target; console.log(this.checked) if(this.checked) { target = document.querySelector('.done') } else { target = document.querySelector('.todo') } target.appendChild(row) } }

五、完整代码整合

将上述三部分整合,完整的HTML文件如下:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>任务清单</title> <style> * { margin: 0px; padding: 0px; box-sizing: border-box; } .nav { width: 800px; height: 100px; margin: 0 auto; display: flex; align-items: center; } .nav input { width: 600px; height: 60px; border-radius: 5px; } .nav button { width: 200px; height: 60px; background-color: orange; color: white; font-size: 20px; border: orange; border-radius: 5px; } .nav button:active { background-color: grey; } .container { width: 800px; display: flex; margin: 0px auto; } h3 { background-color: gray; color: white; text-align: center; width: 400px; height: 60px; padding-top: 15px; } .todo, .done { width: 50%; height: 100%; } .row { width: 400px; display: flex; align-items: center; } span { width: 200px; font-size: 20px; margin-left: 5px; } .row button { width: 90px; height: 40px; font-size: 20px; margin-top: 10px; } </style> </head> <body> <div class="nav"> <input type="text"><button onclick="newJob()">新建任务</button> </div> <div class="container"> <div class="todo"> <h3>未完成</h3> <div class="row"> <input type="checkbox" name="" id=""> <span>吃饭</span><button>删除</button> </div> </div> <div class="done"> <h3>已完成</h3> </div> </div> <script> // let new_job_button = document.querySelector('.nav button') // console.dir(new_job_button) // // 调试代码看属性 function newJob() { // 获取到input输入框按钮 let input = document.querySelector('.nav input') // 获取到输入的信息 let input_info = input.value if(input_info == '') { return } console.log(input_info) // 获取到todo这个div let todo = document.querySelector('.todo') // 创建一个div let div = document.createElement('div') // 创建一个checkbox let checkbox = document.createElement('input') checkbox.type = 'checkbox' // 创建一个span(文本内容是刚才输入的信息对应的文本) let span = document.createElement('span') span.innerHTML = input_info console.log(checkbox) console.log(span) // 创建一个删除button let button = document.createElement('button') button.innerHTML = "删除" div.appendChild(checkbox) div.appendChild(span) div.appendChild(button) console.log(div) // 更新样式 div.className = 'row' // 将div插入到todo这个div中 todo.appendChild(div) // let delete_buttons = document.querySelectorAll('.row button') // console.log(delete_buttons) let delete_buttons = document.querySelectorAll('.row button') for(i = 0; i < delete_buttons.length; i++) { delete_buttons[i].onclick = function() { let parent = this.parentNode; console.log(parent) let grand_parent = parent.parentNode console.log(grand_parent) grand_parent.removeChild(parent) } } let checkbox_buttons = document.querySelectorAll('.row input') for(i = 0; i < checkbox_buttons.length; i++) { checkbox_buttons[i].onclick = function() { // 将节点插入到对应的div中 // row代表的插入的节点 let row = this.parentNode; // target代表的是对row插入到那个div中 // 如果复选框已经被选中,那么target就是已完成对应的这个div // 否则target就是未完成对应的div let target; console.log(this.checked) if(this.checked) { target = document.querySelector('.done') } else { target = document.querySelector('.todo') } target.appendChild(row) } } } </script> </body> </html>

六、总结

通过本案例,我们实现了一个功能完整的任务清单应用。核心要点包括:

  1. 使用document.createElement动态创建DOM元素

  2. 通过appendChild将新元素插入到指定位置

  3. 利用parentNoderemoveChild实现删除功能

  4. 通过checked属性判断复选框状态,实现任务状态的切换

希望本文对你理解前端DOM操作有所帮助!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 0:36:18

自由职业者AI配置终极悖论:工具越多,收入越低?20年技术顾问用A/B测试验证的「最小可行智能体」配置公式

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;自由职业者AI工具配置 自由职业者在远程协作、内容创作与客户交付中&#xff0c;亟需轻量、可定制且隐私可控的本地化AI工具链。本章聚焦于零订阅成本、离线可用、跨平台兼容的核心工具组合&#xff0c;兼顾开…

作者头像 李华
网站建设 2026/6/3 0:25:41

别再死记硬背了!用Python模拟实验,直观理解大数定律与中心极限定理

用Python玩转概率&#xff1a;可视化大数定律与中心极限定理的魔法概率论课本上那些晦涩的数学公式是否让你望而生畏&#xff1f;今天我们将换一种方式&#xff0c;用Python代码和动态图表&#xff0c;带你亲眼见证概率论中最神奇的两个定理——大数定律与中心极限定理如何在数…

作者头像 李华
网站建设 2026/6/3 0:25:07

2026年AI论文网站实测排行,哪款真正适合写论文?

2026 年学术 AI 论文工具已形成全流程、理工 / 社科、英文 / 中文、免费 / 付费的清晰分化。综合实测排行与场景适配&#xff0c;千笔AI 是中文全能首选&#xff0c;DeepSeek 学术版是理工开源首选&#xff0c;毕业之家是国内毕业专属首选。 一、2026 年实测排行 TOP5&#xff…

作者头像 李华