LocalStroage、SessionStroage、Cookie之间的区别、功能、优劣势就不提了,网上的博客一个比一个详细,这个demo的实现也很简单,在这里就直接上这个demo的源码
(不得不说这个作者的代码写的真的有种美感,这个demo来自知乎专栏 我是前端切图仔)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> html { min-height: 100vh; display: flex; justify-content: center; align-items: center; } .wrapper { padding: 20px; max-width: 350px; background: rgba(228, 215, 215, 0.95); box-shadow: 0 0 0 5px rgba(187, 157, 157, 0.5); } h2 { text-align: center; margin: 0; font-weight: 200; } .plates { margin: 0; padding: 0; text-align: left; list-style: none; } .plates li { border-bottom: 1px solid rgba(0,0,0,0.2); padding: 10px 0; font-weight: 100; display: flex; } .plates label { flex:1; cursor: pointer; } .plates input { display: none; } .plates input + label:before { content: '⬜️'; margin-right: 10px; } .plates input:checked + label:before { content: '☆'; } .add-items { margin-top: 20px; } .add-items input { padding:10px; outline:0; border:1px solid rgba(0,0,0,0.1); } .add-items input:nth-child(1){ width: 61.3%; } .add-items input:nth-child(2) { width: 30%; color: rgb(85, 108, 128); font-weight: 700; } .buttons button { width: 100px; margin-top: 10px; height: 40px; color: rgb(85, 108, 128); font-weight: 700; border:1px solid rgba(0,0,0,0.1); } </style> <body> <div class="wrapper"> <h2>ToooooDo</h2> <p></p> <ul class="plates"> <li>待添加事项</li> </ul> <form class="add-items"> <input type="text" name="item" placeholder="Item Name" required> <input type="submit" value="添 加"> </form> <div class="buttons"> <button data-action="clear">删除所有</button> <button data-action="check">全部选中</button> <button data-action="uncheck">取消全选</button> </div> </div> </body> <script> // var str = '{"name":"harold"}'; // var obj = { // name:'harold' // } // console.log(JSON.parse(str),JSON.stringify(obj)); (function(){ function newFun(){ var addItems = document.querySelector('.add-items'), itemsList = document.querySelector('.plates'), buttons = document.querySelector('.buttons'), items = JSON.parse(localStorage.getItem('items')) || []; //添加item的处理函数 function handleAdd(e){ console.log(e);//type=submit e.preventDefault(); console.log(this);//猜想应该是整个表单控件 var name = this.querySelector('[name=item]').value; var item = { name:name, done:false }; items.push(item); localStorage.setItem('items',JSON.stringify(items)); updateList(items,itemsList); this.reset(); } function updateList(plates = [],plateList){ console.log(arguments); plateList.innerHTML = plates.map(function(plate,i){ return ' <li><input type="checkbox" data-index=" ' + i + '" id="plate' + i + '" ' + (plate.done ? 'checked' : '') + ' /><label for="plate' + i + '">' + plate.name + '</label></li>'; }).join(''); } //委托input(typecheckbox)列表的父元素进行监听 function toggleChecked(e){ if(!e.target.matches('input')) return;//如果没有子元素则中止执行 var item = e.target.dataset.index; items[item].done = !items[item].done;//更改状态 localStorage.setItem('items',JSON.stringify(items)); updateList(items,itemsList); } //添加button事件 function doButtonPress(e){ var action = e.target.dataset.action; switch(action){ case"clear": items = []; break; case"check": items.map(function(item){ return item.done = true; }); break; case"uncheck": items.map(function(item){ return item.done = false; }); break; default: return; } localStorage.setItem('items',JSON.stringify(items)); updateList(items,itemsList) } addItems.addEventListener('submit',handleAdd); itemsList.addEventListener('click',toggleChecked); buttons.addEventListener('click',doButtonPress); updateList(items,itemsList); } document.addEventListener('DOMContentLoaded',newFun); }()); </script> </html>