简化版todolist是基于浏览器的本地存储,就是将自己的数据存储到浏览器本地,但更换浏览器后,数据就不会存在。后面可以与服务器连接后使todolist更贴近实际情况。
html代码如下(引用的JS文件的名字叫:原生.JS)
<!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">
<link rel="stylesheet" href="CSS/index.css">
<!-- <script src="JS/jquery.min.js"></script> -->
<!-- <script src="JS/index.js"></script> -->
<title>todilist</title>
</head>
<body>
<header>
<section>
<label for="title">ToDoList</label>
<input type="text" id="title" name="title" placeholder="添加ToDo" required="required" autocomplete="off" />
</section>
</header>
<section class="selt">
<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
</footer>
</body>
<script src="JS/原生.js"></script>
</html>
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;
}
}
Javescript的代码如下
var todolist = document.getElementById("todolist"); //获取代做事情的ul标签
var donelist = document.getElementById("donelist"); //获取做完事情的ol标签
var btn = document.getElementById("title"); 获取输入事件的input标签
loadThings(); //动态渲染函数
function readDate(){
var list = localStorage.getItem("todo"); //从本地内存中获取数据todo
if(list !== null){
return JSON.parse(list); //将获取到的字符串转化为数组对象
}else{
return []
}
}
function setDate(list){
var local = JSON.stringify(list) //将数组转化为字符串,这样才能存入本地存储中
localStorage.setItem("todo",local);
}
function loadThings(){ //动态渲染函数
var listThing = readDate(); //读取本地存储的事情
todolist.innerHTML = ''; //清除方法有很多,这里用innerHTML来清除,JQ中用empty
donelist.innerHTML = ''; //清除方法有很多,这里用innerHTML来清除,JQ中用empty
for(var i=0;i<listThing.length;i++){
var li = document.createElement("li"); //动态创建li
li.setAttribute("count",i); //这个变量用来记录下存储信息的顺序
if(listThing[i].flag == true){
li.innerHTML = "<input type='checkbox' checked = 'checked' class='temp'><P>"+listThing[i].title+"</p><a href='javascript:;'></a>"
donelist.insertBefore(li,donelist.children[0]); //使后添加的元素在最前面
}else{
li.innerHTML = "<input type='checkbox' class='temp'><P>"+listThing[i].title+"</p><a href='javascript:;'></a>"
todolist.insertBefore(li,todolist.children[0]); //使后添加的元素在最前面
}
}
delectItem();
changeSelect();
}
function changeSelect(){ //选择框互换函数,可以修改函数互换的值
var listtemp = document.querySelector(".selt").querySelectorAll("input"); //获取ol,ul中所有的input元素
var listThing = readDate();
for(let i=0;i<listtemp.length;i++){ //遍历获取的input
listtemp[i].onclick = function(){ //添加实践
var index = this.parentNode.getAttribute("count");
console.log(listThing[index].title);
console.log(this.checked);
listThing[index].flag = this.checked;
setDate(listThing);
loadThings()
}
}
}
function delectItem(){
var delectbtn = document.querySelectorAll("a");
var listThing = readDate();
for(let i=0;i<delectbtn.length;i++){
delectbtn[i].onclick = function(){
index = this.parentNode.getAttribute("count");
listThing.splice(index,1);
setDate(listThing);
loadThings();
}
}
}
btn.addEventListener('keydown',function(e){
if(e.key == "Enter"){
var listNewThing = readDate();
var thing = {title:this.value,flag:false};
listNewThing.push(thing);
setDate(listNewThing);
loadThings();
}
})