-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
132 lines (107 loc) · 3.69 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const list = document.getElementById('list');
const createBtn = document.getElementById('create-btn');
let todos = [];
// When you refresh your browser
displayTodos();
// When you click Create Button ---> Create New Todo Data!
createBtn.addEventListener('click', createNewTodo);
// Create New Todo Data(obj)
function createNewTodo() {
// 새로운 item 객체 생성
const item = {
id : new Date().getTime(),
text : "",
complete : false
}
// 배열 처음에 new item 추가
todos.unshift(item);
// Create HTML elements
const {itemEl, inputEl, editBtnEl, removeBtnEl} = createTodoElement(item);
// Prepend new todo item - list 안에 새로운 todo item 맨 위로 추가
list.prepend(itemEl);
inputEl.focus();
// Save new item to LocalStorage
saveToLocalStorage();
}
// Create Todo Element for HTML
function createTodoElement(item) {
// class = "item"인 div 생성
const itemEl = document.createElement('div');
itemEl.classList.add('item');
// checkbox 생성
const checkboxEl = document.createElement('input');
checkboxEl.type = 'checkbox';
checkboxEl.checked = item.complete;
if(item.complete) {
itemEl.classList.add('complete');
}
// text input 생성
const inputEl = document.createElement('input');
inputEl.type = 'text';
inputEl.value = item.text;
// class = "actions"인 div 생성
const actionsEl = document.createElement('div');
actionsEl.classList.add('actions');
// Edit button 생성
const editBtnEl = document.createElement('button');
editBtnEl.classList.add('material-icons');
editBtnEl.innerText = 'edit';
// Remove button 생성
const removeBtnEl = document.createElement('button');
removeBtnEl.classList.add('material-icons', 'remove-btn');
removeBtnEl.innerText = 'remove_circles';
// Append created elements
actionsEl.append(editBtnEl, removeBtnEl);
itemEl.append(checkboxEl, inputEl, actionsEl);
/* ----------------------- EventListeners ------------------------ */
checkboxEl.addEventListener('change', () => { // checkbox 체크/비체크
item.complete = checkboxEl.checked;
if (item.complete) {
itemEl.classList.add('complete');
}
else {
itemEl.classList.remove('complete');
}
saveToLocalStorage()
})
inputEl.addEventListener('input', () => { // input 값 변경
item.text = inputEl.value;
saveToLocalStorage()
})
inputEl.addEventListener('blur', () => { // input이 focus되지 않을 경우
inputEl.setAttribute('disabled', '');
saveToLocalStorage();
})
editBtnEl.addEventListener('click', () => { // edit 버튼 클릭 시
inputEl.removeAttribute('disabled');
inputEl.focus();
})
removeBtnEl.addEventListener('click', () => { // remove 버튼 클릭 시
todos = todos.filter(t => t.id !== item.id);
itemEl.remove();
saveToLocalStorage();
})
/* --------------------------------------------------------------- */
return {itemEl, inputEl, editBtnEl, removeBtnEl};
}
// Save to LocalStorage
function saveToLocalStorage() {
const data = JSON.stringify(todos);
localStorage.setItem('my_todos', data);
}
// Load from LocalStorage
function loadFromLocalStorage() {
const data = localStorage.getItem('my_todos');
if (data) {
todos = JSON.parse(data);
}
}
// Display existing todos on HTML
function displayTodos() {
loadFromLocalStorage();
for (i = 0; i < todos.length; i++) {
const item = todos[i];
const {itemEl} = createTodoElement(item);
list.append(itemEl);
}
}