今天来尝试做个简单版的 To-do List,让自己对於 To-do List 的实作有一个粗略的概念,以下会先叙述实作流程,再一步步完成。
那就开始罗~
因为主要功能包含新增,删除和勾选完成,区域又分成待办事项区和已完成事项区,所以上篇会先针对待办事项区的功能实作,下篇再继续实作已完成事项区的功能。
// 整个待办事项表单
<div class="todo">
// 1. 可以输入事项的区域
<header>
<h4>待办事项</h4>
<div class="form">
<input type="text" placeholder="add todos" class="newTodo">
<button class="btn addButton">新增</button>
</div>
</header>
// 2. 显示待办事项的区域
<ul class="pending">
<!-- 放待办事项新增区域 -->
</ul>
// 3. 显示已完成事项的区域
<h4>完成事项</h4>
<ul class="done">
<!-- 放完成事项区域 -->
</ul>
</div>
以下是会需要监听的元素,先用querySelector()
方法选出来并存到变数中
// 选取元素
let pending = document.querySelector('.pending') // 会放入使用者输入内容的容器
let addButton = document.querySelector('.addButton') // 新增按钮
let input = document.querySelector('.newTodo') //输入框
let done = document.querySelector('.done') // 完成区域
对於节点的新增、删除还没有概念的朋友推荐先看看这篇 走!去浏览器用 create & append 加餐,有超级可爱的饼乾怪,看完保证一定学会节点的操作~~~
li
的元素appendChild()
方法,将节点加入到容器pending
的末端function addTodo (text) {
const newTodo = document.createElement('li')
newTodo.innerHTML = `
<input value ="${text}">
<div class="icon-group">
<i class="delete fa fa-trash"></i>
<i class="check fa fa-check-circle"></i>
</div>
`
pending.appendChild(newTodo)
}
addTodo
函式中,就会新增一笔待办事项addButton.addEventListener("click", function () {
const inputValue = input.value
if (inputValue.trim().length > 0) {
addTodo(inputValue)
}
})
为了确认addTodo
的函式能正常运作,可以先用假资料试试看~
这部分确认成功就可以删除,如果要一开始显示预设的资料可以保留没关系
const todos = ['写今天的铁人赛文章', '写明天的铁人赛文章', '写後天的铁人赛文章']
function displayDummyData(todos) {
for (let todo of todos) {
addTodo(todo)
}
}
displayDummyData(todos);
由於我觉得勾选完成和删除的行为是状态的改变(可能是从未完成到已完成,或是被使用者删除,感觉有点像Promise XD),所以用一个changeState
的函式封装
closest()
向上找到li
元素
closest()
里头的参数放CSS选取器,会向上一直往根节点查找指定的元素,如果找到根节点都没有指定的元素,则传回 null值
li
放入已完成区域pending
aka 待办事项区绑定监听器,如果触发就执行changeState
函式
function changeState (e) {
const list = e.target.closest('li')
if (e.target.classList.contains('delete')) {
list.remove();
}
else if (e.target.classList.contains('check')) {
list.remove()
const itemDone = document.createElement('li')
const content = list.children[0].value
itemDone.innerHTML += `<input value ="${content}" class="checked" disabled="disabled">
<div class="icon-group">
<i class="delete fa fa-trash"></i>
<i class="check fa fa-check-circle"></i>
</div>`
done.appendChild(itemDone)
}
}
pending.addEventListener('click', changeState)
在实作过程中体会到对於节点位置的关系越清晰才不会一直选错节点,如果发生鬼打墙现象建议直接console.log()
,看看自己是不是明明想选苹果却选到奇异果
明天再来实作已完成事项区的部分罗~
参考资料:
实作一个简单的 Todolist (上)
MDN - Element.children
JavaScript大全
>>: Day25 每年都在烦恼要送什麽礼物给亲朋好友吗?何不送个AR明信片呢!?
哇哇哇,挑战第一天我就没准备好,只能很赶的生出一篇文章。 不负责任预告一下:我中文不是很好所以要是文...
1-1 Spring MVC 特质 功能建构在 Servlet、JSP 规格基础上面发展,必须透过 ...
经过一整天的奋斗,终於跟React稍微熟了一点 首先建一个apiUtil.js 我打算把跟後端相关的...
上一篇我们写好了 EtaResponseMapper 的 unit test。但 data laye...
爬虫原理: 抓取资料->分析结构->取出要的结构文字->输出想要的格式 程序码: ...