案例分析:
1.刷新页面不会丢失数据,因此需要用到本地存储localStorage。
2.核心思路是不管按下回车还是点击复选框都是把本地存储的数据加载到页面中,这样保证刷新关闭页面不会丢失数据。
3. 存储的数据格式:var todolist=[{title:'xxx',done:false}]
4.注意点1:本地存储localStorage里面只能存储字符串格式,因此需要把对象转换为字符串JSON.stringify(data)。
5.注意点2:获取本地存储数据,需要把里面的字符串转换为对象格式JSON.parse(),我们才能使用里面的数据。
功能一:按下回车把数据添加到本地存储内
1.页面中的数据都要从本地存储里面获取,这样刷新页面就不会丢失数据,所以要先把数据保存到本地存储里面。
2.利用事件对象keyCode判断用户按下回车键(13).
3.声明一个数据,保存数据。
4.先要读取本地存储原来的数据(声明函数getData()),放到这个数组里面。
5.之后把最新从表单获取过来的数据追加到数组里面。
6.最后把数组存储给本地存储(声明函数savaData())。
代码:
$(function() {
// 1.按下回车,把完整数据存储到本地存储里面
// 存储数据格式 var todoist=[{title:"",done:false}]
$('#title').on('keydown', function(e) {
// 说明按下了回车
if (e.keyCode === 13) {
// 先读取本地存储原来的数据
var local = getdata();
// 把local数组进行更新
local.push({ title: $(this).val(), done: false });
console.log(local);
// 把local这个新数组存储给我们本地存储
savedata(local);
}
})
// 读取本地存储数据的函数
function getdata() {
var data = localStorage.getItem('todolist');
// 说明有数据
if (data != null) {
// 要注意本地存储的数据是字符串格式的,我们需要的是对象格式的,所以需要用JSON.parse()进行钻换
return JSON.parse(data);
}
// 如果没有数据就返回一个空数组就可以了
else {
return [];
}
}
// 保存本地存储数据函数
function savedata(local) {
// 本地存储只能存取字符串格式的数据,所以需要把local转化为字符串格式
localStorage.setItem('todolist', JSON.stringify(local))
}
})
功能二:本地存储数据渲染加载到页面
1.因为后面也会经常渲染加载操作,所以声明一个函数load,方便调用。
2.先要读取本地存储数据,数据不要忘记转化为对象格式。
3.之后遍历这个数据采用$.each(),有几条数据就生成几个li添加到ol里面面。
4.每次渲染之前先要把原先里面的ol内容清空,然后渲染加载最新的数据。
$(function() {
// 每次打开页面就渲染一次
load();
// 1.按下回车,把完整数据存储到本地存储里面
// 存储数据格式 var todoist=[{title:"",done:false}]
$('#title').on('keydown', function(e) {
// 说明按下了回车
if (e.keyCode === 13) {
// 先读取本地存储原来的数据
var local = getdata();
// 把local数组进行更新
local.push({ title: $(this).val(), done: false });
// 把local这个新数组存储给我们本地存储
savedata(local);
// 清空ol
$('ol').empty();
// 2.本地存储数据渲染到页面
load();
}
})
// 读取本地存储数据的函数
function getdata() {
var data = localStorage.getItem('todolist');
// 说明有数据
if (data != null) {
// 要注意本地存储的数据是字符串格式的,我们需要的是对象格式的,所以需要用JSON.parse()进行钻换
return JSON.parse(data);
}
// 如果没有数据就返回一个空数组就可以了
else {
return [];
}
}
// 保存本地存储数据函数
function savedata(local) {
// 本地存储只能存取字符串格式的数据,所以需要把local转化为字符串格式
localStorage.setItem('todolist', JSON.stringify(local))
}
// 本地存储数据渲染到页面
function load() {
// 选读取本地存储的数据
var data = getdata();
// 遍历这个数据
$.each(data, function(index, ele) {
$('ol').prepend("" + ele.title + "
")
})
}
})
功能三:删除操作
1.点击里面的a链接,不是删除的li,而是删除本地存储对应的数据。
2.核心原理:先获取本地存储数据,删除对应的数据,保存给本地存储,重新渲染列表li。
3.我们可以给链接自定义属性记录当前的索引号。
4.根据这个索引号删除相关的数据,可以采用数组的splice(i,1)方法。
5.存储修改后的数据,然后存储给本地存储。
6.因为a是动态创建的,我们使用on方法绑定事件。
$(function() {
// 每次打开页面就渲染一次
load();
// 1.按下回车,把完整数据存储到本地存储里面
// 存储数据格式 var todoist=[{title:"",done:false}]
$('#title').on('keydown', function(e) {
// 说明按下了回车
if (e.keyCode === 13) {
// 先读取本地存储原来的数据
var local = getdata();
// 把local数组进行更新
local.push({ title: $(this).val(), done: false });
// 把local这个新数组存储给我们本地存储
savedata(local);
// 2.本地存储数据渲染到页面
load();
}
})
// 3.删除操作
$('ol').on('click', 'a', function() {
// (1)先获取本地存储
var data = getdata();
// (2)修改数据
// 获取被点击的a的索引号
var i = $(this).attr('id')
// 删除第i条信息 data现在是一个数组
data.splice(i, 1)
// (3)保存到本地存储
savedata(data)
// (4)重新渲染页面
load();
})
// 读取本地存储数据的函数
function getdata() {
var data = localStorage.getItem('todolist');
// 说明有数据
if (data != null) {
// 要注意本地存储的数据是字符串格式的,我们需要的是对象格式的,所以需要用JSON.parse()进行钻换
return JSON.parse(data);
}
// 如果没有数据就返回一个空数组就可以了
else {
return [];
}
}
// 保存本地存储数据函数
function savedata(local) {
// 本地存储只能存取字符串格式的数据,所以需要把local转化为字符串格式
localStorage.setItem('todolist', JSON.stringify(local))
}
// 本地存储数据渲染到页面
function load() {
// 选读取本地存储的数据
var data = getdata();
// 清空ol
$('ol').empty();
// 遍历这个数据
$.each(data, function(index, ele) {
$('ol').prepend("" + ele.title + "
")
})
}
})
功能四:正在进行和已完成选项操作
1.当我们点击了小的复选框,修改本地存储数据,再重新渲染数据列表
2.点击之后,获取本地存储数据
3.修改对应数据属性done为当前复选框的checked状态
4.之后保存数据到本地存储
5.重新渲染加载数据列表
6.load加载函数里面,新增一个条件,如果当前数据的done为true就是已经完成,就把列表渲染到ul里面
7.如果当前数据的done为false,则是待办事项,就把列表渲染加载到ol里面
代码:
$(function() {
// 每次打开页面就渲染一次
load();
// 1.按下回车,把完整数据存储到本地存储里面
// 存储数据格式 var todoist=[{title:"",done:false}]
$('#title').on('keydown', function(e) {
// 说明按下了回车
if (e.keyCode === 13) {
// 先读取本地存储原来的数据
var local = getdata();
// 把local数组进行更新
local.push({ title: $(this).val(), done: false });
// 把local这个新数组存储给我们本地存储
savedata(local);
// 2.本地存储数据渲染到页面
load();
// 把表单里面的内容清空
$(this).val('');
}
})
// 3.删除操作
$('ol').on('click', 'a', function() {
// (1)先获取本地存储
var data = getdata();
// (2)修改数据
// 获取被点击的a的索引号
var i = $(this).attr('id')
// 删除第i条信息 data现在是一个数组
data.splice(i, 1)
// (3)保存到本地存储
savedata(data)
// (4)重新渲染页面
load();
})
// 正在进行和已完成选项操作
$('ol,ul').on('click', 'input', function() {
// (1)先获取本地存储的数据
var data = getdata();
// (2)修改数据
// 先获取到索引号
var index = $(this).siblings('a').attr('id');
data[index].done = $(this).prop('checked');
console.log(data);
// (3)保存到本地存储
savedata(data)
// (4)重新渲染页面
load();
})
// 读取本地存储数据的函数
function getdata() {
var data = localStorage.getItem('todolist');
// 说明有数据
if (data != null) {
// 要注意本地存储的数据是字符串格式的,我们需要的是对象格式的,所以需要用JSON.parse()进行钻换
return JSON.parse(data);
}
// 如果没有数据就返回一个空数组就可以了
else {
return [];
}
}
// 保存本地存储数据函数
function savedata(local) {
// 本地存储只能存取字符串格式的数据,所以需要把local转化为字符串格式
localStorage.setItem('todolist', JSON.stringify(local))
}
// 本地存储数据渲染到页面
function load() {
// 选读取本地存储的数据
var data = getdata();
// 清空ol
$('ol').empty();
// 清空ul
$('ul').empty();
// 遍历这个数据
$.each(data, function(index, ele) {
// 如果完成了放在ul里面
if (ele.done) {
$('ul').prepend("" + ele.title + "
")
}
// 如果没有完成放在ol里面
else {
$('ol').prepend("" + ele.title + "
")
}
})
}
})
功能五:统计正在进行个数和已经完成个数
1.在load函数里面操作
2.声明两个变量:todoCount待办个数,doneCount已完成个数
3.当进行遍历本地存储数据的时候,如果数据done为false,则todoCount++否则doneCount++
4.最后修改相应元素的text()
完整代码如下:
html部分:
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;
}
p {
margin: 0;
}
li p input {
top: 3px;
left: 40px;
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);
}
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;
}
}
Jquery部分:
$(function() {
// 每次打开页面就渲染一次
load();
// 1.按下回车,把完整数据存储到本地存储里面
// 存储数据格式 var todoist=[{title:"",done:false}]
$('#title').on('keydown', function(e) {
// 说明按下了回车
if (e.keyCode === 13) {
if ($(this).val() === '') {
alert('请输入您要的操作')
} else {
// 先读取本地存储原来的数据
var local = getdata();
// 把local数组进行更新
local.push({ title: $(this).val(), done: false });
// 把local这个新数组存储给我们本地存储
savedata(local);
// 2.本地存储数据渲染到页面
load();
// 把表单里面的内容清空
$(this).val('');
}
}
})
// 3.删除操作
$('ol,ul').on('click', 'a', function() {
// (1)先获取本地存储
var data = getdata();
// (2)修改数据
// 获取被点击的a的索引号
var i = $(this).attr('id')
// 删除第i条信息 data现在是一个数组
data.splice(i, 1)
// (3)保存到本地存储
savedata(data)
// (4)重新渲染页面
load();
})
// 正在进行和已完成选项操作
$('ol,ul').on('click', 'input', function() {
// (1)先获取本地存储的数据
var data = getdata();
// (2)修改数据
// 先获取到索引号
var index = $(this).siblings('a').attr('id');
data[index].done = $(this).prop('checked');
console.log(data);
// (3)保存到本地存储
savedata(data)
// (4)重新渲染页面
load();
})
// 读取本地存储数据的函数
function getdata() {
var data = localStorage.getItem('todolist');
// 说明有数据
if (data != null) {
// 要注意本地存储的数据是字符串格式的,我们需要的是对象格式的,所以需要用JSON.parse()进行钻换
return JSON.parse(data);
}
// 如果没有数据就返回一个空数组就可以了
else {
return [];
}
}
// 保存本地存储数据函数
function savedata(local) {
// 本地存储只能存取字符串格式的数据,所以需要把local转化为字符串格式
localStorage.setItem('todolist', JSON.stringify(local))
}
// 本地存储数据渲染到页面
function load() {
// 选读取本地存储的数据
var data = getdata();
// 清空ol
$('ol').empty();
// 清空ul
$('ul').empty();
var todoCount = 0;
var doneCount = 0;
// 遍历这个数据
$.each(data, function(index, ele) {
// 如果完成了放在ul里面
if (ele.done) {
$('ul').prepend("" + ele.title + "
")
doneCount++;
}
// 如果没有完成放在ol里面
else {
$('ol').prepend("" + ele.title + "
")
todoCount++;
}
})
$('#todocount').text(todoCount);
$('#donecount').text(doneCount);
}
})