HTML、CSS、JS、jQuery实现toDolist,实现本地存储功能。
展示
HTML页面
<!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>第二个玄学</title>
<link href="../考核/two.css" rel="stylesheet" />
<script src="../jquery.min.js"></script>
<script src="../考核/san.js"></script>
</head>
<body>
<div class="container">
<!-- 开始头部部分 -->
<header>
<section>
<div class="first">
<label for="title">这玄学的一天天</label>
<input type="text" id="title" name="title" placeholder="添加任务" required="required" autocomplete="off">
<img src="../img/鼓励.png" id="img">
</div>
</section>
</header>
<!-- 结束头部部分 -->
<!-- 开始任务部分 -->
<section>
<h3>正在进行 <span id="todocount">0</span></h3>
<ol id="todolist" class="demo-box"></ol>
<h3>已经完成 <span id="donecount">0</span></h3>
<ul id="donelist"></ul>
</section>
<!-- 结束任务部分 -->
</div>
</body>
</html>
CSS页面
body {
margin: 0;
padding: 0;
font-size: 16px;
}
ol,ul {
padding: 0;
list-style: none;
}
.container {
width: 660px;
height: 660px;
/* background-color: aqua; */
margin: 0 auto;
margin-top: 30px;
border-radius: 10%;
border: 2px solid;
}
/* 开始头部 */
header {
height: 80px;
/* background-color: brown; */
border-radius: 20%;
padding-top: 3px;
margin-left: 20px;
}
.first {
margin-top: 30px;
}
section {
margin: 0 auto;
}
label {
float: left;
width: 150px;
line-height: 50px;
color: black;
font-size: 18px;
cursor: pointer;
margin-left: 40px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}
header input {
float: right;
width: 250px;
height: 24px;
margin-top: 12px;
margin-right: 119px;
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
}
img {
float: right;
margin-right: -316px;
margin-top: 12px;
}
/* 结束头部 */
/* 开始任务部分 */
h3 {
position: relative;
margin-left: 60px;
}
span {
position:absolute;
top:2px;
right:60px;
display:inline-block;
padding:0 5px;
height:20px;
border-radius:30px;
background:rgba(14,191,234,0.62);
line-height:22px;
text-align:center;
color:#666;
font-size:14px;
}
li input{
position:absolute;
top:2px;
left:50px;
width:22px;
height:22px;
cursor:pointer;
}
p{
margin: 0;
user-select: none;
margin-left: 40px;
}
li p input{
top:3px;
left: 83px;
width:70%;
height:20px;
line-height:14px;
text-indent:5px;
font-size:14px;
}
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);
cursor: pointer;
}
ol li{
cursor:move;
}
ul li{
border-left: 5px solid rgb(13, 12, 12);
opacity: 0.5;
}
li a{
position:absolute;
top:2px;
right:55px;
display:inline-block;
width:14px;
height:12px;
border-radius:14px;
border:6px double #FFF;
background:#0ebc77d9;
line-height:14px;
text-align:center;
color:#FFF;
font-weight:bold;
font-size:14px;
cursor:pointer;
}
/* 结束任务部分 */
JS页面
$(function(){
// alert(11);
// 按下回车 把完整数据存储到本地存储里面
// 存储的数据格式 var todolist=[{title:"xxx",done:false}]
load();
$("#title").on("keydown",function(event) {
if(event.keyCode==13) {
if($(this).val()===""){
alert("输入操作");
var data=getDate();
}else{
// alert(11);
// 先读取本地存储原来的数据
var local=getDate();
// console.log(local);
// 把local数组进行更新数据 把最新的数据追加给local数组
local.push({title: $(this).val(),done:false});//$(this).val表示上方输入的内容
// 把这个数组local存储给本地存储
saveDate(local);//方便本地存储数据调用
// toDoList本地存储数据渲染加载到页面
load();
$(this).val("");
}
}
});
$("#img").on("click",function(event){
if($("input").val()===""){
alert("输入nr");
var data=getDate();
}else{
var local=getDate();
local.push({title: $(this).val(),done:false});
saveDate(local);
load();
$("input").val("");
alert(11);
}
})
//删除操作
$("ol,ul").on("click","a",function(){
// alert(11);
// 按照先获取本地存储
var data=getDate();
// 修改数据
var index=$(this).attr("id");
// console.log(index);
data.splice(index,1);
saveDate(data);
load();
});
//正在进行和已完成选项操作
$("ol,ul").on("click","input",function(){
// alert(11);
// 先获取本地存储数据
var data=getDate();
// 修改数据
var index=$(this).siblings("a").attr("id");
// console.log(index);
data[index].done=$(this).prop("checked");
// console.log(data);
saveDate(data);
load();
});
// 修改
$("ol, ul").on("dblclick", "p", function() {
var data = getDate();
var index = $(this).siblings("a").attr("index");
// 先将p原来的内容获取过来
var str = $(this).text();
// 创建一个文本框,直接添加到p里
$(this).prepend('<input type="text" />');
// 将原来内容给文本框,并让其为选中状态
var input = $(this).children();
input.val(str);
input.select();
// 文本框失去焦点,将修改过的文本框的内容给title
$(input).on("blur", function() {
data[index].title = input.val();
saveDate(data);
load();
})
// 按下回车也可以保存修改
$(input).on("keyup", function(e) {
if(e.keyCode === 13) { // 回车ASCII值为13
// 手动调用点击事件
this.blur();
}
})
})
// 读取本地存储的数据
function getDate(){
var data=localStorage.getItem("todolist");
if(data!==null) {
// 本地存储里面的数据是字符串格式的,但是我们需要的是对象格式的
return JSON.parse(data);
}else{
return [];
}
}
// 保存本地存储数据
function saveDate(data) {
localStorage.setItem("todolist",JSON.stringify(data));
}
// 渲染加载数据
function load() {
var data=getDate();
// console.log(data);
// 遍历之前先清空ol里面的元素内容 防止出现两次
$("ol,ul").empty();
var todoCount=0;//正在进行的个数
var doneCount=0;//已经完成的个数
//遍历这个数据
$.each(data,function(i,n){
// console.log(n);
if(n.done) {
$("ul").prepend("<li><input type='checkedbox' checked='checked'><p>"+n.title+"</p><a href='javascript:;' id="+i+"></a></li>")
doneCount++;
}else{
$("ol").prepend("<li><input type='checkbox'><p>"+n.title+"</p><a href='javascript:;' id="+i+"></a></li>")
todoCount++;
}
});
$("#todocount").text(todoCount);
$("#donecount").text(doneCount);
}
})
同时记得引入jQuery代码