toDoList案例

  1. 效果:  

    1. 在输入框输入内容之后  点击添加可以向正在进行的任务下面添加上内容.还需要将新添加的内容存到本地.  2.点击一下前面的选中框的时候  可以让这一行向 已经完成的任务进行跳转.需要修改一下 在本地存储的数据中的 isOk:true  代表完成了 

 2.代码:

<!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>
    <link rel="stylesheet" href="./css/index.css" />
  </head>
  <body>
    <!-- 输入框 -->
    <div class="plan">
      <h1>传智-ToDoList</h1>
      <div>
        <input class="txt" placeholder="请输入目标..." type="text" />
        <input type="button" class="add" value="添加" />
      </div>
    </div>
    <div class="w">
      <h2>正在进行的任务</h2>
      <ol>
        <!-- <li><input type="checkbox"><span>吃饭</span></li> -->
      </ol>
      <h2>已经完成的任务</h2>
      <ul>
        <!-- <li><span>吃饭</span></li>-->
      </ul>
    </div>
    <script src="lib/jquery-1.12.4.js"></script>
    <!-- <script src="js/index.js"></script> -->
    <script type="text/javascript">
      //获取本地的数据
      let str = localStorage.getItem("toDoList"); //进行判断是否有 如果没有话 自定义一个数据
      if (str == null) {
        localStorage.setItem(
          "toDoList",
          '[{"name":"吃饭","isOk":false },{"name":"睡觉","isOk":true }]'
        );
        str = localStorage.getItem("toDoList");
      } //得到这个数据之后  进行循环这个数据  在每次循环中还要判断下isOk的值  决定新创建li的标签是放在哪个位置 // 在创建li标签的时候 通过attr()创建一个假设的索引值  类似于index  为了标记这个li表示的是数据中的哪个对象  所以根据数组的索引值来创建最好
      let arr = JSON.parse(str);
      for (let i = 0; i < arr.length; i++) {
        if (arr[i].isOk == true) {
          $("<li></li>")
            .html("<span>" + arr[i].name + "</span>")
            .appendTo("ul");
        } else {
          $("<li></li>")
            .attr("num", i)
            .html('<input type="checkbox"><span>' + arr[i].name + "</span>")
            .appendTo("ol");
        }
      }
      //设置添加事件
      $(".add").click(function () {
        let doThing = $(".txt").val();
        let li = $(
          '<li><input type="checkbox"><span>' + doThing + "</span></li>"
        );
        $("ol").eq(0).append(li); //页面元素已经添加完成之后  将数据更新到本地
        $(".txt").val(""); //新创建的元素最好是根据本地数据的索引值设定的自定义属性
        li.attr("num", arr.length);
        //页面完成之后  需要在本地保存数据
        arr.push({ name: doThing, isOk: false });
        str = JSON.stringify(arr);
        localStorage.setItem("toDoList", str);
      });
      //给checkbox 加上事件委托
      $("ol").on("click", "input", function () {
        $("ul").append($(this).parent());
        $(this).hide();
        let li = $(this).parent();
        //通过li设定的自定义属性 num 也就是这个li对象在数组中得到索引  从而找到这个对象  然后进行修改其isOk的值
        let i = li.attr("num");
        arr[i].isOk = true;
        str = JSON.stringify(arr);
        localStorage.setItem("toDoList", str);
      });
    </script>
  </body>
</html>

3.创作流程

  1.给添加按钮 完成事件绑定 

  2,给checkbox 添加事件绑定   因为都是li和input都是动态创建的元素 绑定不上事件 所以使用 事件委托给外面的ol 

  3.在页面功能代码写好之后  需要对本地数据进行增加或者修改的处理

     3.1 在页面加载的时候 首先要去本地区获取数据  通过数据中的isOk的不同 从而创建不同li标签 添加到不同位置 去显示.

      注意:创建li标签的时候  需要根据数据中的每个对象自定义一个属性num 

    3.2 点击增加的之后  需要将内容更新到本地数据中去

    3.3 点击checkbox的时候 需要根据li的获取到对应数据中的对象  从而修改一下isOk的值 

      注意:因为一开始在创建li标签就是根据数据中的对象的索引值创建的 并且将对象的索引值 设定成了每个li的自定义属性     通过li中的自定义属性就可以获取到 对象在数据中的索引值 从而找到这个对象 进行了修改

4总结:

  在给页面创建li标签的时候  没有意识到 数据中的每个对象与li之间的关系  

  数据中的每个对象就相当创建的一个li对象  

  因为一开始的时候是在获取数据的时候创建的li对象给li增加的自定义属性  则在手动添加数据的时候  也要给li设置自定义属性 

原文地址:https://www.cnblogs.com/shicongcong0910/p/12717057.html