Skip to content

Commit 45617f3

Browse files
committed
15 complete code part
1 parent 9833bed commit 45617f3

File tree

2 files changed

+50
-7
lines changed

2 files changed

+50
-7
lines changed

15 - LocalStorage/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
> 简介:[JavaScript30](https://javascript30.com)[Wes Bos](https://github.com/wesbos) 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 15 篇。完整指南在 [GitHub](https://github.com/soyaine/JavaScript30),喜欢请 Star 哦♪(^∇^*)
55
66
> 创建时间:2017-07-24
7-
最后更新:2017-07-27
7+
最后更新:2017-08-05
88

99
## 实现效果
1010
## 知识点
@@ -31,4 +31,6 @@ this 获取当前 form,是从 submit 事件获取到的。
3131
this.querySelector('[name=item]'); 获取其中的输入框
3232

3333
this.reset();
34-
以清空 input 中正在输入的值
34+
以清空 input 中正在输入的值
35+
36+
使用 localStorage 的时候,直接传入 items 得到的是 [object Object],所以需要在把数据传进去之前就把内容转换成 String 类型的数据。

15 - LocalStorage/index-SOYAINE.html

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@ <h2>LOCAL TAPAS</h2>
2222
<form class="add-items">
2323
<input type="text" name="item" placeholder="Item Name" required>
2424
<input type="submit" value="+ Add Item">
25+
<input class="check-all" type="button" value="Check All">
26+
<input class="uncheck-all" type="button" value="Uncheck All">
27+
<input class="delete-all" type="button" value="Delete All">
28+
2529
</form>
2630
</div>
2731

2832
<script>
2933
const addItems = document.querySelector('.add-items');
3034
const itemsList = document.querySelector('.plates');
31-
const items = [];
35+
var items = JSON.parse(localStorage.getItem('items')) || [];
3236

3337
function addItem(e) {
3438
e.preventDefault();
@@ -40,23 +44,60 @@ <h2>LOCAL TAPAS</h2>
4044
items.push(item);
4145
this.reset();
4246
populateList(items, itemsList);
47+
localStorage.setItem('items', JSON.stringify(items));
4348
console.log(text);
4449
}
4550

4651
function populateList(plates = [], plateslist) {
4752
plateslist.innerHTML = plates.map((plate, i) => {
4853
return `
4954
<li>
50-
<label>${plate.text}</label>
55+
<input type="checkbox" data-index=${i} id="item${i}" ${plate.done ? 'checked' : ''} >
56+
<label for="item${i}">${plate.text}</label>
5157
</li>
5258
`;
5359
}).join('');
5460
}
55-
61+
62+
function toggleDone(e) {
63+
if (!e.target.matches('input')) return;
64+
const el = e.target;
65+
const index = el.dataset.index;
66+
items[index].done = !items[index].done;
67+
populateList(items, itemsList);
68+
localStorage.setItem('items', JSON.stringify(items));
69+
console.log(el.dataset.index);
70+
}
5671
addItems.addEventListener('submit', addItem);
72+
itemsList.addEventListener('click', toggleDone);
73+
populateList(items, itemsList);
5774

75+
76+
const checkAllBtn = document.querySelector('.check-all');
77+
const unCheckAllBtn = document.querySelector('.uncheck-all');
78+
const deleteAllBtn = document.querySelector('.delete-all');
79+
80+
checkAllBtn.addEventListener('click', () => {
81+
items.forEach(item => {
82+
item.done = true;
83+
});
84+
populateList(items, itemsList);
85+
localStorage.setItem('items', JSON.stringify(items));
86+
});
87+
88+
unCheckAllBtn.addEventListener('click', () => {
89+
items.forEach(item => {
90+
item.done = false;
91+
});
92+
populateList(items, itemsList);
93+
localStorage.setItem('items', JSON.stringify(items));
94+
});
95+
96+
deleteAllBtn.addEventListener('click', () => {
97+
items = [];
98+
populateList(items, itemsList);
99+
localStorage.setItem('items', JSON.stringify(items));
100+
});
58101
</script>
59-
60-
61102
</body>
62103
</html>

0 commit comments

Comments
 (0)