ToDOList案例
练习功能点
- 本地存储数据
- 使用本地存储数据
- 数据 增删改查功能
- 遍历数据 $.each() 使用
- 动态创建元素 加在前面 prepend() 加在后面是append()
- 给动态创建元素添加事件功能
- 清空数据 empty();
- push()添加新的数据到原先数据组中
- 获取修改 attr() 自定义值 prop() 元素属性
div,p,h2,h3,h5,label,input,header,li,ul,ol,body{list-style:none;margin:0;padding:0;}body{background-color:#eee;}header{width:100%;background-color:#666;color:#fff;overflow:hidden;line-height:35px;margin:auto;padding:10px;}header input{width:50%;height:35px;border-radius:20px;float:right;margin:0;padding:0 15px;}section,footer{width:100%;max-width:800px;overflow:hidden;margin:10px auto;}section h2{font-size:22px;color:#333;margin:10px auto;}section h2 span{float:right;font-size:12px;background-color:#fefefe;border-radius:5px;color:#999;display:inline-block;margin:6px 12px;padding:2px 5px;}section ol li{background-color:#fff;border-left:solid 5px #f06;}section ul li{background-color:#efefef;border-left:solid 5px #999;}section li{font-size:14px;border-radius:5px;color:#333;overflow:hidden;box-sizing:border-box;box-shadow:1px 1px 6px #999;margin:10px 5px;padding:10px 20px;}section li a{float:right;}section li p{float:left;display:inline-block;margin:0 10px;}section li input{width:20px;height:20px;float:left;}section li input[type=checkbox]:checked::after{content:"✓";color:#999;font-family:'Arial Narrow Bold', sans-serif;font-size:18px;font-weight:bolder;line-height:20px;background-color:#fefefe;border-radius:5px;border:solid 1px #999;margin:0 -3px;padding:1px 6px;}footer{text-align:center;font-size:12px;}
<header>
<section>
<label for="title">toDOList</label>
<input type="text" id="title" name="title" placeholder="添加ToDo" required>
</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© 2018 todolist.cn
</footer>
$(function() {
// 本地存储 只存字符串 只能所数组对像转换成为字符串格式 JSON.stringify()
// localStorage.setItem("to", JSON.stringify(todolist));
// 获取本地存储的数据,我们需要把里面的字符 串数据 转换为对像格式 JSON.parse()
// data = JSON.stringify(data));
load();
$("#title").on("keydown", function(event) {
if (event.keyCode === 13) {
if ($(this).val() === "") {
alert("请输入你的操作")
} else { // 先读取本地存储原来的数据
var local = getDate();
//把local数组进行更新数据 ,把最新的数据追加给local数组
local.push({
title: $(this).val(),
done: false
});
//把local数组 存进本地数组
saveDate(local);
// todolist 本地存储数据渲染加载到页面
load();
$(this).val("");
}
}
});
$("ol,ul").on("click", "a", function() {
// 获取本地存储
var data = getDate();
// 修改数据 attr()获取自定义属性
var index = $(this).attr("id")
data.splice(index, 1);
// 保存到本地存储
saveDate(data);
// 重新渲染页面
load();
})
// 正在进行和已完成选项操作
$("ol,ul").on("click", "input", function() {
// 获取本地存储数据
var data = getDate();
// 修改数据attr()自定义值 prop()元素属性
var index = $(this).siblings("a").attr("id");
data[index].done = $(this).prop("checked");
// 保存到本地存储数据
saveDate(data);
// 重新渲染
load();
})
//读取本地存储的数据
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();
// 先清空ol所有的数据
$("ol,ul").empty();
// 待办总数
var todoCount = 0;
//做完总数
var doneCount = 0;
//遍历这个数据
$.each(data, function(i, e) {
// 加在前面 prepend() 加在后面是append()
if (e.done) {
$("ul").prepend("<li><input type='checkbox' checked='checked' value=''><p>" + e.title + "</p><a href='javascript:;' id=" + i + ">删除</a></li>")
doneCount++ //每遍历一次+1
} else {
$("ol").prepend("<li><input type='checkbox' name='' value=''><p>" + e.title + "</p><a href='javascript:;' id=" + i + ">删除</a></li>");
todoCount++ //每遍历一次+1
}
})
$("#todocount").text(todoCount)
$("#donecount").text(doneCount)
}
})