jQuery实现todolist

jQuery实现todolist

1、本地存储localStorage
2、jQuery实现交互

js

$(function () {
  // alert(11);
  // 1. 按下回车 把完整数据 存储到本地存储里面
  // 存储的数据格式  var todolist = [{title: "xxx", done: false}]
  load();
  $("#title").on("keydown", function (event) {
    if (event.keyCode === 13) {
      if ($(this).val() === "") {
        alert("请输入您要的操作");
      } else {
        // 先读取本地存储原来的数据
        var local = getDate();
        // console.log(local);
        // 把local数组进行更新数据 把最新的数据追加给local数组
        local.push({
          title: $(this).val(),
          done: false
        });
        // 把这个数组local 存储给本地存储
        saveDate(local);
        // 2. toDoList 本地存储数据渲染加载到页面
        load();
        $(this).val("");
      }
    }
  });
  // 3. toDoList 删除操作
  $("ol, ul").on("click", "a", function () {
    // alert(11);
    // 先获取本地存储
    var data = getDate();
    console.log(data);
    // 修改数据
    var index = $(this).attr("id");
    console.log(index);
    data.splice(index, 1);
    // 保存到本地存储
    saveDate(data);
    // 重新渲染页面
    load();
  });
  
  // 4. toDoList 正在进行和已完成选项操作
  $("ol, ul").on("click", "input", function () {
    // alert(11);
    // 先获取本地存储的数据
    var data = getDate();
    // 修改数据
    var index = $(this).siblings("a").attr("id");
    console.log(index);
    // data[?].done = ?
    data[index].done = $(this).prop("checked");
    console.log(data);

    // 保存到本地存储
    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();
    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='checkbox' 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);
  }

})

html

<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  <title>ToDoList—最简单的待办事项列表</title>
  <link rel="stylesheet" href="css/index.css">
  <script src="js/jquery.min.js"></script>
  <script src="js/todolist.js"></script>
</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>
    <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 &copy; 2020 todolist.cn
  </footer>


</body>

</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;
  }
}

效果图

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值