JS错误记录 - To-do List
var data = (localStorage.getItem('todolist'))?
JSON.parse(localStorage.getItem('todolist')) : {
todo: [],
done : [] // 键值对 用冒号
};
renderTodoList();
var oBtnAdd = document.getElementById('add');
var oInput = document.getElementById('input');
// var oLi = document.createElement('li');
// 这个li必须在function里面获取,否则li每次都是直接覆盖,没有create新的li。
// 问题: 输入框复制了很多字之后, 闪烁光标不见了?
oBtnAdd.addEventListener('click', newTodo);
oInput.addEventListener('keydown', function(e){
if( e.code === 'Enter' || e.code === 'NumpadEnter') newTodo();
});
function newTodo(){
var value = oInput.value;
if(oInput.value) {
addItemToDOM(value);
data.todo.push(value);
dataUpdate();
}
oInput.value = '';
};
function renderTodoList() {
if (!data.todo.length && !data.done.length) return;
for (var i = 0; i < data.todo.length; i++) {
var value = data.todo[i];
addItemToDOM(value);
}
for (var j = 0; j < data.done.length; j++) {
var value = data.done[j];
addItemToDOM(value, true);
}
};
// 点击完成的按钮, 切换事项完成的情况。
function completed(){
var itemLi = this.parentNode.parentNode; //保存旧的数据
var parentUl = itemLi.parentNode;
var id = parentUl.id;
var value = itemLi.innerText;
if (id === 'todoID') {
data.todo.splice(data.todo.indexOf(value), 1);
data.done.push(value);
} else{
data.done.splice(data.todo.indexOf(value), 1);
data.todo.push(value);
};
// 如果这个li是完成的,就变成未完成,反之就是完成。
//(id === 'todo')? id = 'completed': id = 'todo';
// 直接改变Ul的id值是错的, 这样并没改变li元素所在的环境, 只是给父Ul赋值新的ID名而已。
// 判断Ul的ID 是不是todo, 即判断, 要移动的li元素 在todo列表里,还是在done列表里。
// 然后把li元素放到和初始Ul的ID 相反的Ul里面去。 即 移动这条清单到和之前相反的列表里。
// 获取页面中已经存在的Ul, 并把和初始Ul相反的Ul 确定为移动的目标,存为target
var target = (id === 'todoID') ? document.getElementById('doneID'):document.getElementById('todoID');
parentUl.removeChild(itemLi);
// 这里删掉的还是原本的Ul里的li,旧的父子关系。 都是前面存下来的。
target.insertBefore(itemLi, target.children[0]);
// 插入li元素, 插到新获取的target里。
// 旧数据赋值给新的li
// 删掉旧的li
dataUpdate();
};
function removeBtn(){
var deleteLi = this.parentNode.parentNode;
var parent = deleteLi.parentNode;
var id = parent.id;
var value = deleteLi.innerText;
//点击按钮,要删掉的是该行li的文字内容。即innerText
if (id === 'todoID') {
data.todo.splice(data.todo.indexOf(value), 1);
} else{
data.done.splice(data.done.indexOf(value), 1);
}
dataUpdate();
parent.removeChild(deleteLi);
};
function addItemToDOM(text, done){
var removeSVG = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" style="enable-background:new 0 0 22 22;" xml:space="preserve"> <g> <g> <path class="fill" d="M16.1,3.6h-1.9V3.3c0-1.3-1-2.3-2.3-2.3h-1.7C8.9,1,7.8,2,7.8,3.3v0.2H5.9c-1.3,0-2.3,1-2.3,2.3v1.3 c0,0.5,0.4,0.9,0.9,1v10.5c0,1.3,1,2.3,2.3,2.3h8.5c1.3,0,2.3-1,2.3-2.3V8.2c0.5-0.1,0.9-0.5,0.9-1V5.9 C18.4,4.6,17.4,3.6,16.1,3.6z M9.1,3.3c0-0.6,0.5-1.1,1.1-1.1h1.7c0.6,0,1.1,0.5,1.1,1.1v0.2H9.1V3.3z M16.3,18.7 c0,0.6-0.5,1.1-1.1,1.1H6.7c-0.6,0-1.1-0.5-1.1-1.1V8.2h10.6L16.3,18.7L16.3,18.7z M17.2,7H4.8V5.9c0-0.6,0.5-1.1,1.1-1.1h10.2 c0.6,0,1.1,0.5,1.1,1.1V7z"/> </g> <g> <g> <path class="fill" d="M11,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8c0-0.4,0.3-0.6,0.6-0.6s0.6,0.3,0.6,0.6v6.8C11.6,17.7,11.4,18,11,18z"/> </g> <g> <path class="fill" d="M8,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8C7.4,10.2,7.7,10,8,10c0.4,0,0.6,0.3,0.6,0.6v6.8C8.7,17.7,8.4,18,8,18z" /> </g> <g> <path class="fill" d="M14,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8c0-0.4,0.3-0.6,0.6-0.6c0.4,0,0.6,0.3,0.6,0.6v6.8 C14.6,17.7,14.3,18,14,18z"/> </g> </g> </g> </svg>';
var completeSVG = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" style="enable-background:new 0 0 22 22;" xml:space="preserve"> <g> <path class="fill" d="M9.7,14.4L9.7,14.4c-0.2,0-0.4-0.1-0.5-0.2l-2.7-2.7c-0.3-0.3-0.3-0.8,0-1.1s0.8-0.3,1.1,0l2.1,2.1l4.8-4.8 c0.3-0.3,0.8-0.3,1.1,0s0.3,0.8,0,1.1l-5.3,5.3C10.1,14.3,9.9,14.4,9.7,14.4z"/> </g> </svg>';
var Buttons = document.createElement('div');
Buttons.classList.add('buttons');
var oDel = document.createElement('button');
oDel.classList.add('delete');
oDel.innerHTML = removeSVG;
oDel.addEventListener('click', removeBtn);
var oDone = document.createElement('button');
oDone.classList.add('done');
oDone.innerHTML = completeSVG;
oDone.addEventListener('click', completed);
Buttons.appendChild(oDel);
Buttons.appendChild(oDone);
var oLi = document.createElement('li');
oLi.innerText = text;
oLi.appendChild(Buttons);
var oUl = (done) ? document.getElementById('doneID'):document.getElementById('todoID');
// if(oUl.children[0]){
// oUl.insertBefore(oLi, oUl.children[0]);
// }else{
// oUl.appendChild(oLi);
// };
oUl.insertBefore(oLi, oUl.children[0]);
// 为什么这个children不需要判断第0位是否有值?
dataUpdate();
};
// 创建div,两个按钮,填充svg
/*function btnSvg(){
var oDiv = document.createElement('div');
var oDel = document.createElement('button');
var oDone = document.createElement('button');
var removeSVG = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" style="enable-background:new 0 0 22 22;" xml:space="preserve"> <g> <g> <path class="fill" d="M16.1,3.6h-1.9V3.3c0-1.3-1-2.3-2.3-2.3h-1.7C8.9,1,7.8,2,7.8,3.3v0.2H5.9c-1.3,0-2.3,1-2.3,2.3v1.3 c0,0.5,0.4,0.9,0.9,1v10.5c0,1.3,1,2.3,2.3,2.3h8.5c1.3,0,2.3-1,2.3-2.3V8.2c0.5-0.1,0.9-0.5,0.9-1V5.9 C18.4,4.6,17.4,3.6,16.1,3.6z M9.1,3.3c0-0.6,0.5-1.1,1.1-1.1h1.7c0.6,0,1.1,0.5,1.1,1.1v0.2H9.1V3.3z M16.3,18.7 c0,0.6-0.5,1.1-1.1,1.1H6.7c-0.6,0-1.1-0.5-1.1-1.1V8.2h10.6L16.3,18.7L16.3,18.7z M17.2,7H4.8V5.9c0-0.6,0.5-1.1,1.1-1.1h10.2 c0.6,0,1.1,0.5,1.1,1.1V7z"/> </g> <g> <g> <path class="fill" d="M11,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8c0-0.4,0.3-0.6,0.6-0.6s0.6,0.3,0.6,0.6v6.8C11.6,17.7,11.4,18,11,18z"/> </g> <g> <path class="fill" d="M8,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8C7.4,10.2,7.7,10,8,10c0.4,0,0.6,0.3,0.6,0.6v6.8C8.7,17.7,8.4,18,8,18z" /> </g> <g> <path class="fill" d="M14,18c-0.4,0-0.6-0.3-0.6-0.6v-6.8c0-0.4,0.3-0.6,0.6-0.6c0.4,0,0.6,0.3,0.6,0.6v6.8 C14.6,17.7,14.3,18,14,18z"/> </g> </g> </g> </svg>';
var completeSVG = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" style="enable-background:new 0 0 22 22;" xml:space="preserve"> <g> <path class="fill" d="M9.7,14.4L9.7,14.4c-0.2,0-0.4-0.1-0.5-0.2l-2.7-2.7c-0.3-0.3-0.3-0.8,0-1.1s0.8-0.3,1.1,0l2.1,2.1l4.8-4.8 c0.3-0.3,0.8-0.3,1.1,0s0.3,0.8,0,1.1l-5.3,5.3C10.1,14.3,9.9,14.4,9.7,14.4z"/> </g> </svg>';
oDiv.classList.add('buttons');
oDel.classList.add('delete');
oDone.classList.add('done');
oDel.innerHTML = removeSVG;
// 点击删除事件写在创建元素的时候,对应的就是每个按钮自己的事件。 不需要for循环。
oDel.addEventListener('click', removeBtn);
// 从onclick 改成 addEventListener 就可以把外部函数包含this的调用了。
// !!! 需要搞清楚这个原理。
oDone.innerHTML = completeSVG;
oDone.addEventListener('click', completed);
//括号里不能直接放 completed(), 这里是调用函数, 不是调用函数处理的结果。
oDiv.appendChild(oDel);
oDiv.appendChild(oDone);
return oDiv;
}*/
function dataUpdate(){
localStorage.setItem('todolist', JSON.stringify(data));
// stringify方法里的data从哪来?? --在前面数组操作里已经操作过了
};
JS错误记录 - To-do List的更多相关文章
- JS错误记录 - 微博发布
<style> *{ margin: 0; padding: 0;} #ul1{ width: 400px; height: 400px; border: 1px solid #000; ...
- JS错误记录 - 右侧悬浮框 - 缓冲运动
本次练习错误总结: 1. 正确: startMove( document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop); ...
- JS错误记录 - dom操作 - 排序
本次练习错误总结: 1. for循环要套到按钮的onclick里面,否则onclick点击事件无法依次执行. 2. var n1, var n2 这两个变量是arr.sort排序使用的,所以应该放在s ...
- JS错误记录 - 事件 - 拖拽
错误总结: 1. var disX = 0; 现在window.onload里声明变量,而不是在事件oDiv.onmousedown里面声明并赋值. 对于这个还不是很明白. 2. onmoused ...
- JS错误记录 - 按左右箭头div移动、一串div跟着鼠标移动
本次练习错误总结: 1. div跟着用户操作而移动,首先必须要绝对定位,否则无法移动. 2. if条件语句里面是双等号,不是单等号(赋值). 3. 坐标值没有Right,只能offsetLeft 加减 ...
- JS错误记录 - getStyle代替offset、任意值运动框
本次练习错误总结: 1. 改变border的宽度,属性名称不是直接写border,而是borderWidth. 2. 运动函数 -- 清除定时器 -- 开启新的定时器. 不是在新定时器开启之后再清除 ...
- JS错误记录 - fgm练习 - 函数传参
<script> window.onload = function() { var oBtn = document.getElementsByTagName('button')[0]; v ...
- JS错误记录 - 记录上次登陆的用户名
<script> //步骤 1.submit => 用户名存进cookie 2. onload => 从cookie读取用户名 window.onload = function ...
- JS错误记录 - 取消事件冒泡、按钮、回车、ctrl回车提交留言
window.onload = function () { var oDiv = document.getElementById('div1'); var oBtn = document.getEle ...
随机推荐
- LeetCode -- 最大连续乘积子序列
问题描写叙述: 给定数组,找出连续乘积最大值的子序列.比如 0,-1,-3.-2.则最大连续乘积为6= (-3) * (-2) 实现思路此题与最大连续和的子序列问题相似,也可通过找到递推公式然后用DP ...
- Azure 配置高可用的准备系列工作-建立不同区域的存储账户和建立网络!
我们谈到我们的业务,常常谈到一个词.三层架构,就是我们的UI层.数据訪问层和数据存储层的分离,通常情况下我们的业务高可用必须满足这三层的所有高可用的情况下才干达到最高级别的高可用. 那么谈到Az ...
- CSS响应式布局到底是什么?
响应式布局是最近几年在前端开发中非常火热的词,它是相对于固定像素大小的网页而言的,那么CSS响应式布局到底是什么?顾名思义,响应式布局就是网页能够响应各种各样不同分辨率大小的设备,能够将网页很好的呈献 ...
- 《Linux企业应用案例精解》一书已由清华大学出版社出版
<Linux企业应用案例精解>简介 650) this.width=650;" border="0" alt="223754878.jpg" ...
- C#读写config配置文件--读取配置文件类
一:通过Key访问Value的方法: //判断App.config配置文件中是否有Key(非null) if (ConfigurationManager.AppSettings.HasKeys()) ...
- SQL函数_Charindex()
1 charindex()函数的作用是用于发现目标字符串第一次出现在源字符串中出现的开始位置. 语法如下 : select charinde(目标字符串,列名或字符串[,起始位置]) from 表名
- git pull 、git fetch、 git clone
git clone 代表从远程克隆过来包括所有的版本信息 git fetch是从远程获取最新的版本 git pull相当于 git fetch 然后再git merge
- Scrapy框架之日志等级
一.日志等级 CRITICAL:严重错误 ERROR:一般错误 WARNING:警告 INFO: 一般信息 DEBUG:调试信息 [注意:默认的日志等级是DEBUG] 二.日志等级设置 修改setti ...
- Reference Counting GC (Part one)
目录 引用计数法 计数器值的增减 new_obj()和update_ptr()函数 new_obj()生成对象 update_ptr()更新指针ptr,对计数器进行增减 优点 可即可回收垃圾 最大暂停 ...
- Android 採用HTML设计界面
由于Android软件开发分工眼下还没有细化,程序猿往往须要负责软件界面的开发,尽管软件的界面图片已经由美工设计好了.可是假设使用layout技术把软件做成美丽的界面确实非常困难,而是也比較耗时.An ...