当前位置:网站首页>【精讲】利用原生js实现todolist
【精讲】利用原生js实现todolist
2022-08-03 04:26:00 【共创splendid--与您携手】
通过原生js实现todolist:
第一部分:css样式部分
body {margin:0;padding:0;font-size:16px;background: #CDCDCD;}
header {height:50px;background:#333;background:rgba(47,47,47,0.98);}
section{margin:0 auto;}
label{float:left;width:100px;line-height:50px;color:#DDD;font-size:24px;cursor:pointer;font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;}
header input{float:right;width:60%;height:24px;margin-top:12px;text-indent:10px;border-radius:5px;box-shadow: 0 1px 0 rgba(255,255,255,0.24), 0 1px 6px rgba(0,0,0,0.45) inset;border:none}
input:focus{outline-width:0}
h2{position:relative;}
span{position:absolute;top:2px;right:5px;display:inline-block;padding:0 5px;height:20px;border-radius:20px;background:#E6E6FA;line-height:22px;text-align:center;color:#666;font-size:14px;}
ol,ul{padding:0;list-style:none;}
li input{position:absolute;top:2px;left:10px;width:22px;height:22px;cursor:pointer; border: none;}
p{margin: 0;}
li p input{top:3px;left:40px;width:70%;height:20px;line-height:14px;text-indent:6px;font-size:14px;}
li p input:focus{outline:1px solid #000;margin-top:2px;}
li{height:32px;line-height:32px;background: #fff;position:relative;margin-bottom: 10px;
padding:0 45px;border-radius:3px;border-left: 5px solid #629A9C;box-shadow: 0 1px 2px rgba(0,0,0,0.07);}
ol li{cursor:move;}
ul li{border-left: 5px solid #999;opacity: 0.5;}
li a{position:absolute;top:2px;right:5px;display:inline-block;width:14px;height:12px;border-radius:14px;border:6px double #FFF;background:#CCC;line-height:14px;text-align:center;color:#FFF;font-weight:bold;font-size:14px;cursor:pointer;}
footer{color:#666;font-size:14px;text-align:center;}
footer a{color:#666;text-decoration:none;color:#999;}
@media screen and (max-device-width: 620px) {section{width:96%;padding:0 2%;}}
@media screen and (min-width: 620px) {section{width:600px;padding:0 10px;}}
HTML内容部分:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>ToDoList—最简单的待办事项列表</title>
<meta name="description" content="ToDoList无须注册即可使用,数据存储在用户浏览器的html5本地数据库里,是最简单最安全的待办事项列表应用!" />
<link rel="stylesheet" type="text/css" href="./css/index.css"/>
</head>
<body>
<header>
<section>
<form action="" id="form" οnclick="">
<input type="text" id="title" value="" name="title" placeholder="添加ToDo" required="required" autocomplete="off" />
</form>
</section>
</header>
<section>
<h2>正在进行 <span id="todocount"></span></h2>
<ol id="todolist" class="demo-box">
</ol>
<h2>已经完成 <span id="donecount"></span></h2>
<ul id="donelist">
</ul>
</section>
<footer>
Copyright © 2014 todolist.cn <a href="javascript:clear();">clear</a>
</footer>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
js内容部分:
var title = document.querySelector("#title");
var ol = document.querySelector("#todolist");
var ul = document.querySelector("#donelist");
locd()
// 回车存储数据
title.addEventListener('keyup',function(e){
// 这里是所以调用是因为每执行一次就需要将数据保存到数组中一次
var arr = getData()
// 这里必须使用e.keyCode否则失效
if(e.keyCode == 13){
var todo = {
title:title.value,
done:false
}
// 根据 getData() 获取的数据返回值,调用至该函数后将数据存入数组中
arr.push(todo);
// 传入一个实参
cunchu(arr);
// 获取form表单验证
// var form = document.querySelector('#form')
// // reset()是重置属性 在这里重置表单提交内容
// form.reset()
var form = document.querySelector('#form')
form.reset()
locd()
}
})
// 存储数据
function cunchu(shuzu){
// 将数据存起来
window.localStorage.setItem('todo',JSON.stringify(shuzu))
}
// 获取数据
function getData(){
// 之所以将localStorage.getItem('todo')放置在该位置 因获取存储的数据 对数据进行解析转换为字符串的格式
var data = window.localStorage.getItem('todo')
// 通过上面data 所获取的值在下面进行判断,(获取到值不为空(意味着可以解析),那么就执行第一个,否则执行第二个)
if(data != null){
// 解析data所获取的值为字符型/数组
return JSON.parse(data)
}else{
// 若获取到值 不为数组 那么先返回一个数组将数据放在数组中
return []
}
}
// 加载数据
function locd(){
//获取页面标签
var todocount = document.querySelector("#todocount")
var donecount = document.querySelector('#donecount')
// 设置num1与num2起始值都为空
var num1=0;
var num2=0;
// 每次调用都让页面中的ol,ul内部的子级都清空一次
ol.innerHTML='';
ul.innerHTML='';
// 调用获取的数据遍历forEach循环 随后创建li并且将li里的值打印到页面中
var data=getData();
data.forEach((item,index)=>{
var li=document.createElement('li')
li.innerHTML= `<input type="checkbox" /><p id="p${index}">${item.title}</p><a href="javascript:;" id="${index}">-</a>`
// 判断item中的值是true还是false
if(item.done){
// 是true,说明已经点击,则将数据传入ul列表中去
ul.insertBefore(li,ul.children[0])
li.children[0].checked = 'checked';
num2++
}else{
// 若是false说明未点击,将数据传入ol列表中去
ol.insertBefore(li,ol.children[0]);
num1++
}
})
// 通过上面的num1与num2可以动态计算列表内部有多少个子级
todocount.innerHTML = num1;
donecount.innerHTML = num2;
}
// 编辑数据
function bianji(){
ol.addEventListener('dblclick',function(e){
var p = e.target;
if(e.target.nodeName == 'P'){
p.innerHTML = `<input type="text" value="${p.innerText}" id="input${p.id}">`
// 点击后,使每一个子级选中
p.children[0].select();
p.children[0].addEventListener('blur',function(e){
//获取数据
var shuju = getData();
// 截取字符串 下标是1
var i = p.id.substring(1);
// 将当前编辑好的数据修改
shuju[i].title = this.value;
cunchu(shuju);
locd()
})
}
})
}
bianji();
// 删除数据
function remove(){
ol.addEventListener('click',function(e){
//这里是点击a删除数据 所以后面的a需要大写
var p = e.target;
if(p.nodeName == 'A'){
// 调用获取的数据,可对数组中删除指定元素或者插入元素、替换元素。这里是删除
var i = p.id
var data = getData();
data.splice(i,1);
cunchu(data);
locd()
}
})
}
remove();
//切换正在进行完成
// 传入两个参数 第一个是列表(ol/ul) 第二个是传入的值判断是true还是false (适用于上下传切换)
function change(teml,tell){
teml.addEventListener('click', function(e) {
var input = e.target
if (input.nodeName == 'INPUT') {
var i = input.nextElementSibling.nextElementSibling.id;
var data = getData();
data[i].done =tell;
cunchu(data);
locd()
}
})
}
change(ol,true);
change(ul,false);
边栏推荐
猜你喜欢
随机推荐
WinForm(二):WinFrom中Main函数的入参和出参
2.何为张量
富瑞宣布战略交易,以简化运营,持续专注于打造领先的独立全服务型全球投行公司
13.机器学习基础:数据预处理与特征工程
Smart fitness gesture recognition: PP - TinyPose build AI virtual trainer!
MediaRecorder录制屏幕时在部分机型上报错prepare failed:-22
工程制图点的投影练习
常见亲脂性细胞膜染料DiO, Dil, DiR, Did光谱图和实验操作流程
Windows 安装PostgreSQL
The flink sql task is changed, and after adding several fields to the sql, an error occurs when restoring from the previously saved savepoint.
【生物素叠氮化物|cas:908007-17-0】价格_厂家
TCP 和UDP 的详细介绍
MySQL 出现 The table is full 的解决方法
mysql bool盲注
银微转债,洁特转债上市价格预测
2022河南萌新联赛第(四)场:郑州轻工业大学 G - 迷宫
Shell之条件语句
DOM破环和两个实验的复现
lc marathon 8.2
让环境自己说话,论环境自描述的重要性