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

使用JavaScript实现一个代办事项的小案例

核心功能:

  • 添加任务(add按钮)
  • 完成任务(mark按钮,完成后任务不可点击修改按钮)
  • 修改任务(update按钮,修改任务期间不可点击完成和删除按钮)
  • 删除任务(delete按钮)

HTNL部分代码

<body><div class="container"><!-- 输入框 --><form action="" class="form"><input type="text" class="text"><input type="button" value="add" class="btn"></form><!-- 内容区 --><table border="1" class="content"><thead><tr><th class="item-oper">代办事项</th><th id="operate" class="item-oper">操作</th></tr></thead><tbody><!-- 使用JavaScript生成任务列表 --></tbody></table></div>
</body>
  • 输入框:是进行添加任务
  • 内容区:是添加完任务后,通过JavaScript生成任务列表,对列表进行其它的操作

CSS样式代码

*{margin: 0;padding: 0;font-family: '怒放字体';border-radius: 2px;
}
@font-face {font-family: '怒放字体';src: url(../font/GongFanNuFangTi\(TaoBaoSouGongFanZiKuKeMaiDanZiShouQuan\)-2.ttf);
}.container{width: 400px;margin: 200px auto 0;
}/* 输入框 */
.form{display: flex;
}
.text{width: 360px;outline: none;     /* 外轮廓去掉 */border: solid 1px;padding: 3px;
}
.btn{width: 40px;height: 26px;border: solid 1px;background: #ace3f4;
}/* 内容区 */
.content{margin-top: 15px;width: 100%;
}
.item-oper{text-align: center;border: black solid 1px;border-radius: 2px;background: #ace3f4;
}
#operate{width: 150px;
}
td{font-size: 14px;/* text-decoration: line-through; */
}
tr td:nth-child(2){text-align: center;padding: 2px 3px;
}
tr td:nth-child(2) input{border-width: 1px;margin: 0 2px;
}

通过HTML和CSS,简易的代办事项雏形已完成:
雏形
现在通过JavaScript来进行事件绑定,实现任务的添加修改删除完成

JavaScript代码

添加事件

  • 添加事件要创建表格:第一个单元格放置添加内容,第二个单元格放置内容操作按钮,将单元格放置在tbody标签内
  • 输入框中的字符串前后空格去掉,且不能添加空内容
    • trim():作用是去掉字符全前后的空格
  • 任务添加后,输入框中的内容清空
// 添加事件
var btn = document.querySelector(".btn")
var text = document.querySelector(".text")
var tbody = document.querySelector("tbody")btn.onclick = function(){ //绑事件,事件触发之后,才执行if(text.value.trim()!=""){//如果输入不为空执行下面操作// 添加表格标签var tr = document.createElement("tr")//创建tr标签var td1 = document.createElement("td")//创建td标签var td2 = document.createElement("td")//创建td标签td1.innerHTML = text.value.trim()//第一个单元格赋输入的内容  trim()作用是去掉空格td2.innerHTML = '<input type="button" value="mark" class="mark">'+'<input type="button" value="delete" class="delete">'+'<input type="button" value="update" class="update"></input>'//第二个单元格赋按钮tr.appendChild(td1)tr.appendChild(td2)//将两个td标签放置在tr标签内tbody.appendChild(tr)//将tr放置在tbody标签内text.value = ""//添加后,输入框内容清空}
}

删除事件

  • 由于删除按钮是任务添加后才有的操作,所以要写在btn.onclick = function()操作中
  • 找到要删除的内容,询问是否确定要删除,防止误点删除按钮的问题
    • confirm(""):作用询问框
btn.onclick = function(){// 删除事件var deletes = document.querySelectorAll(".delete")for(var i=0;i<deletes.length;i++){deletes[i].onclick = function(){//绑事件var target = this.parentElement.parentElement//找要删除的标签if(confirm("确定要删除吗?")){tbody.removeChild(target)}}}
}

完成事件

  • 由于完成按钮是任务添加后才有的操作,所以要写在btn.onclick = function()操作中
var endCompleted//完成的事项btn.onclick = function(){// 完成事件var marks = document.querySelectorAll(".mark")for(var i=0;i<marks.length;i++){marks[i].onclick = function(){//绑事件var target = this.parentElement.previousElementSiblingtarget.style.textDecoration = "line-through"target.style.color = "#a4b0be"target.style.background = "#f1f2f6"endCompleted = this.parentElement.parentElement//完成的事项tbody.appendChild(endCompleted)}}
}

优化1:只用完成的待办事项才能删除
优化删除事件中的代码,设置只有完成的才能删除:

if(this.parentElement.previousElementSibling.style.textDecoration == "line-through"){//设置只有完成的才能删除if(confirm("确定要删除吗?")){tbody.removeChild(target)}} else {alert("完成才能删除!!!请努力完成吧!!!")}

优化2:完成的待办事项在最底部,新添加的任务在完成的上面
优化添加事件中的代码,设置新任务插入到完成事项的上面:

var fistCompleted = tbody.querySelector('tr td[style*="line-through"]')// 插入到tbody的开头(所有已完成事项的上方)
if(fistCompleted){tbody.insertBefore(tr, fistCompleted.parentNode)
}else{tbody.appendChild(tr)//将tr放置在tbody标签内
}

优化3:完成的事项不需要进行修改
优化完成事件中的代码,添加一个逻辑判断:

if(target.style.textDecoration=='line-through'){var updateBtn = this.parentElement.querySelector(".update")updateBtn.disabled = true
}

修改事件

  • 由于修改按钮是任务添加后才有的操作,所以要写在btn.onclick = function()操作中
  • 修改事项内容返回到输入框中,且添加按钮改为修改按钮,修改内容后,点击修改按钮,之后输入框内容清空,按钮变会添加按钮
var target_up//全局变量
var markBtn
var deleteBtn
var updatesbtn.onclick = function(){// 修改事件// 第一步:回显updates = document.querySelectorAll(".update")for(var i=0;i<updates.length;i++){updates[i].onclick = function(){//绑事件target_up = this.parentElement.previousElementSiblingtext.value = target_up.innerHTMLbtn.value = 'update'target_up.style.background = "#f1f2f6"}   }// 第二步:修改if(btn.value == 'update'){//判断是添加还是修改按钮target_up.innerHTML = text.valuetext.value = ""btn.value = "add"target_up.style.background = "#fff"return}
}

优化:修改时,其他的操作按钮不能点击

markBtn = this.parentElement.querySelector(".mark");
deleteBtn = this.parentElement.querySelector(".delete");
markBtn.disabled = true;
deleteBtn.disabled = true;//上面四行代码作用是:修改时,这两个按钮不能点击

JavaScript完整代码

window.onload = function() {// 添加事件var btn = document.querySelector(".btn")var text = document.querySelector(".text")var tbody = document.querySelector("tbody")var endCompleted//完成的事项var target_up//全局变量var markBtnvar deleteBtnvar updatesbtn.onclick = function(){ //绑事件,事件触发之后,才执行// 第二步:修改if(btn.value == 'update'){//判断是添加还是修改按钮target_up.innerHTML = text.valuetext.value = ""btn.value = "add"target_up.style.background = "#fff"markBtn.disabled = false;deleteBtn.disabled = false;//回复按钮return}if(text.value.trim()!=""){//如果输入不为空执行下面操作// 添加表格标签var tr = document.createElement("tr")//创建tr标签var td1 = document.createElement("td")//创建td标签var td2 = document.createElement("td")//创建td标签td1.innerHTML = text.value.trim()//第一个单元格赋输入的内容  trim()作用是去掉空格td2.innerHTML = '<input type="button" value="mark" class="mark">'+'<input type="button" value="delete" class="delete">'+'<input type="button" value="update" class="update"></input>'//第二个单元格赋按钮tr.appendChild(td1)tr.appendChild(td2)//将两个td标签放置在tr标签内var fistCompleted = tbody.querySelector('tr td[style*="line-through"]')// 插入到tbody的开头(所有已完成事项的上方)if(fistCompleted){tbody.insertBefore(tr, fistCompleted.parentNode)}else{tbody.appendChild(tr)//将tr放置在tbody标签内}text.value = ""//添加后,输入框内容清空}// 删除事件var deletes = document.querySelectorAll(".delete")for(var i=0;i<deletes.length;i++){deletes[i].onclick = function(){//绑事件var target = this.parentElement.parentElement//找要删除的标签if(this.parentElement.previousElementSibling.style.textDecoration == "line-through"){//设置只有完成的才能删除if(confirm("确定要删除吗?")){tbody.removeChild(target)}} else {alert("完成才能删除!!!请努力完成吧!!!")}}}// 完成事件var marks = document.querySelectorAll(".mark")for(var i=0;i<marks.length;i++){marks[i].onclick = function(){//绑事件var target = this.parentElement.previousElementSiblingtarget.style.textDecoration = "line-through"target.style.color = "#a4b0be"target.style.background = "#f1f2f6"endCompleted = this.parentElement.parentElement//完成的事项tbody.appendChild(endCompleted)if(target.style.textDecoration=='line-through'){var updateBtn = this.parentElement.querySelector(".update")updateBtn.disabled = true}}}// 修改事件// 第一步:回显updates = document.querySelectorAll(".update")for(var i=0;i<updates.length;i++){updates[i].onclick = function(){//绑事件target_up = this.parentElement.previousElementSiblingtext.value = target_up.innerHTMLbtn.value = 'update'target_up.style.background = "#f1f2f6"markBtn = this.parentElement.querySelector(".mark");deleteBtn = this.parentElement.querySelector(".delete");markBtn.disabled = true;deleteBtn.disabled = true;//上面四行代码作用是:修改时,这两个按钮不能点击}   }}
}

案例

http://www.dtcms.com/a/301927.html

相关文章:

  • 基于亮数据 MCP 的 Trae 智能体,让规模化 Google 数据实时分析触手可及
  • MCP资源管理深度实践:动态数据源集成方案
  • 剑指“CPU飙高”问题
  • 从视觉到智能:RTSP|RTMP推拉流模块如何助力“边缘AI系统”的闭环协同?
  • Entity Framework Core (EF Core) 中状态检测
  • 编程算法:技术创新的引擎与业务增长的核心驱动力
  • 【前端】Tab切换时的数据重置与加载策略技术文档
  • HTB赛季8靶场 - era
  • 可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)
  • S7-200 SMART 通过本体 RS485 口与 DP01 上传 / 下载程序(网口故障)
  • FastGPT本地构建工作流高级编排(最新4.11.0)
  • Windows 11 下 Anaconda 命令修复指南及常见问题解决
  • Linux应用开发基础知识——LInux学习FreeType编程(七)
  • 【Linux | 网络】传输层(UDP和TCP) - 两万字详细讲解!!
  • 绿算技术携手昇腾发布高性能全闪硬盘缓存设备,推动AI大模型降本增效
  • LeetCode--50.Pow(x,n)
  • MySQL的常用数据类型详解
  • python毕业设计案例:基于python django的抖音数据分析与可视化系统,可视化有echarts,算法包括lstm+朴素贝叶斯算法
  • Java项目:基于SSM框架实现的社区团购管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
  • PyTorch入门动态图与神经网络构建
  • PostgreSQL 14.4 ARM64 架构源码编译安装指南
  • 【运维】HuggingFace缓存目录结构详解
  • MySQL SQL性能优化与慢查询分析实战指南:新手DBA成长之路
  • 【第四章:大模型(LLM)】01.神经网络中的 NLP-(2)Seq2Seq 原理及代码解析
  • 数据结构 | 队列:从概念到实战
  • nvim cspell
  • Nginx HTTP 反向代理负载均衡实验
  • NAT地址转换,静态NAT,高级NAT,NAPT,easy IP
  • 【Linux指南】Linux粘滞位详解:解决共享目录文件删除安全隐患
  • GaussDB 开发基本规范