作业题目:实现“todolist项目”

作业需求:

基础需求:85%
参考链接http://www.todolist.cn/
1. 将用户输入添加至待办项
2. 可以对todolist进行分类(待办项和已完成组),用户勾选既将待办项分入已完成组,也可以将已完成变成未完成
3. todolist的每一项可删除和编辑
4. 下方有clear按钮,并清空所有todolist项
5. 使用html、css、js、jquery编写

编码规范需求:15%
1. 代码有相应的注释
2. 程序有文档说明文件(README.md参考:https://github.com/csrftoken/vueDrfDemo)
3. 程序的说明文档必须包含的内容:程序的实现的功能、程序的启动方式、程序的运行效果
4. 程序设计的流程图
(可以参考:https://www.processon.com/view/link/589eb841e4b0999184934329)

程序目录划分:

css:样式
js:js
ToDoList.html:网站
README.md:说明文档

实现效果:

总结:

体会到了数据渲染视图,数据驱动视图,需要多练习。

html代码:

<!DOCTYPE html>
<html>
<head>
<title>ToDoList-最简单的待办事项列表</title>
<link rel="stylesheet" type="text/css" href="css/index.css">
</head>
<body>
<!--头部栏 -->
<header>
<section>
<form action="javascript:void(0);" id="form">
<label for="title">ToDoList</label>
<input type="text" name="title" id="title" placeholder="添加ToDo">
</form>
</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>
路飞学城todolist.cn <a href="javascript:;">clear</a>
</footer> <script src="js/jquery-3.4.1.js"></script>
<script type="text/javascript" src="js/index.js"></script> </body>
</html>

css代码:

body {
margin:;
padding:;
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:} 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:;
list-style:none;
} li input{
position:absolute;
top:2px;
left:10px;
width:22px;
height:22px;
cursor:pointer;
}
p{
margin:;
}
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%;
}
}
/*响应式 大于620px的时候显示下面的css样式*/
@media screen and (min-width: 620px)
{section{
width:600px;
padding:0 10px;
}
}

js代码:

$(function(){
//数据渲染视图,数据驱动视图 //加载数据的方法
function loadData(){
var collection = localStorage.getItem('todo');
if (collection) {
return JSON.parse(collection);
}else{
return [];
}
}
//保存数据的方法
function saveData(data){
localStorage.setItem('todo',JSON.stringify(data));
} //更新数据
function update(i,key,value){
var data = loadData();
//删除
// var i = parseInt($(this).attr('index'));
var todo = data.splice(i,1)[0];
//done-->true
todo[key] =value;
//替换
data.splice(i,0,todo);
saveData(data);
load();
} //加载网页的数据
load();
function load(){ var todoCount = 0;
var doneCount = 0;
var doneStr ='';
var todoStr ='';
var todoList = loadData();
if (todoList && todoList.length>0) {
//有数据 todoList.forEach(function(data,i){
if(data.done){
//已经完成
doneStr +=`<li>
<input type="checkbox" index=${i} checked="checked">
<p id='p-${i}' index=${i}>${data.title}</p>
<a href="javascript:;">-</a>
</li>`;
doneCount++; }else{
//正在进行
todoStr +=`<li>
<input type="checkbox" index=${i}">
<p id='p-${i}' index=${i}>${data.title}</p>
<a href="javascript:;">-</a>
</li>`;
todoCount++;
}
$('#donelist').html(doneStr);
$('#todolist').html(todoStr);
$('#todocount').html(todoCount);
$('#donecount').html(doneCount);
}) }else{
//无数据
$('#todolist').html('');
$('#donelist').html('');
$('#todocount').html(todoCount);
$('#donecount').html(doneCount);
} }
//添加数据的方法
$('#title').keydown(function(event){ if(event.keyCode ===13){
//获取输入框的值
var val = $(this).val();
if(!val){
alert('please input~')
}else{
var data = loadData();
data.unshift({
title:val,
done:false,
});
//清空input
$(this).val('');
//更新一下数据
saveData(data);
load();
}
}
}) //事件代理的方式 删除数据的方法
$('#todolist').on('click','a',function(){
var data = loadData();
var i =$(this).parent().index();
//在数组中删除
data.splice(i,1);
saveData(data);
load();
})
$('#donelist').on('click','a',function(){
var data = loadData();
var i =$(this).parent().index();
//在数组中删除
data.splice(i,1);
saveData(data);
load();
})
//更新数据
$('#todolist').on('change','input[type=checkbox]',function(){
//获取li的索引
var i = parseInt($(this).attr('index'));
//更新数据
update(i,'done',true);
}) //编辑操作
$('#todolist').on('click','p',function(){
// var i =$(this).parent().index();
var i = parseInt($(this).attr('index'));
console.log(i);//
var title = $(this).html();
var $p=$(this);
$p.html(`<input type='text' id='input-${i}' value=${title}>`);
//获取焦点 选中
$(`#input-${i}`)[0].setSelectionRange(0,$(`#input-${i}`).val().length);
$(`#input-${i}`).focus();
//失去焦点
$(`#input-${i}`).blur(function(){
if ($(this).val().length===0) {
$p.html(title);
}else{
update(i,'title',$(this).val());
}
}) }) })

最新文章

  1. Server.Transfer方式(或称HttpContext方式)传值实例
  2. Xcode升级后插件失效的原理与修复办法
  3. 使用 React和webpack开发和打包发布
  4. nginx源代码分析--读请求主体(1)
  5. Linux的selinux
  6. 查找一个数组中最小的前n项
  7. ogg的孩子-无损音频编解码flac
  8. Spring2.5整合Ibatis入门级开发实例
  9. Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)
  10. java枚举使用 总结
  11. java 获取日期的几天前,几个月前和几年前
  12. POJ 1236 Network of Schools (Tarjan)
  13. GBT MBR
  14. php xml格式对象 返回-&gt;对应格式数组
  15. this指向问题 --无return
  16. IP路由原理
  17. struts2标签在jsp页面中构建map集合,循环显示
  18. Netty入门(十)解码分隔符和基于长度的协议
  19. JAVA 中不错的开源FTP组件:commons-net
  20. 深入浅出LVM on linux

热门文章

  1. 洛谷 题解 P1196 【[NOI2002]银河英雄传说】
  2. centos7 64位如何配置网络
  3. 《剑指offer》查找二维数组内元素 c++
  4. 究竟什么是Java异常?
  5. [转帖]电源ac和dc有什么区别_dc ac分别代表什么
  6. [转帖]Docker 更新版本 以及 data-root
  7. HttpServletRequest对象(转)
  8. 报错Could not find resource cn/smbms/dao/provider/ProviderMapper.xml
  9. 在win下开发的项目怎么迁移到linux下面才能正常运行?
  10. Log4net采用外部配置文件和多记录器的方法