자바스크립트 3.4~
3.4
html
<!DOCTYPE html>
<html>
<head>
<title>Something</title>
<link rel="stylesheet" href="style.css" />
<meta charset="UTF-8" />
</head>
<body>
<div class="js-clock">
<h1>00:00</h1>
</div>
<form class="js-form form">
<input type="text" placeholder="what is your name?" />
</form>
<h4 class="js-greetings gretting"></h4>
<!--todolist 추가html-->
<form class="js-toDoForm">
<input type="text" placeholder="Write a to do" />
</form>
<ul class="js-toDoList"></ul>
<script src="clock.js"></script>
<script src="gretting.js"></script>
<script src="todo.js"></script>
</body>
</html>
javascript
const toDoForm = document.querySelector(".js-toDoForm"),
toDoInput = toDoForm.querySelector("input"),
toDoList = document.querySelector(".js-toDoList");
const TODOS_LS = 'toDos';
function paintToDo(text){
console.log(text);
}
function handleSubmit(event){
event.preventDefault();
const currentValue = toDoInput.value;
paintToDo(currentValue);
}
function loadToDos(){
const toDos = localStorage.getItem(TODOS_LS);
if(toDos !== null){
}
}
function init() {
loadToDos();
toDoForm.addEventListener("submit", handleSubmit)
}
init();
결과
function handleSubmit(event){
event.preventDefault();
const currentValue = toDoInput.value;
paintToDo(currentValue);
//값 입력하면 제출하고 다시 wirte a to do 화면으로 넘어가기
toDoInput.value ="";
}
결과
javascript
const toDoForm = document.querySelector(".js-toDoForm"),
toDoInput = toDoForm.querySelector("input"),
toDoList = document.querySelector(".js-toDoList");
const TODOS_LS = 'toDos';
function paintToDo(text){
const li = document.createElement("li");
const delBtn = document.createElement("button");
delBtn.innerText = "❌";
const span = document.createElement("span");
span.innerText = text;
li.appendChild(span);
li.appendChild(delBtn);
toDoList.appendChild(li);
}
function handleSubmit(event){
event.preventDefault();
const currentValue = toDoInput.value;
paintToDo(currentValue);
//값 입력하면 제출하고 다시 wirte a to do 화면으로 넘어가기
toDoInput.value ="";
}
function loadToDos(){
const toDos = localStorage.getItem(TODOS_LS);
if(toDos !== null){
}
}
function init() {
loadToDos();
toDoForm.addEventListener("submit", handleSubmit);
}
init();
결과
그런데 종종 이모지가(😍😍❌ 이런게 이모지)깨져보일때가 있는데 그럴땐 html에서
<meta charset="utf-8" />
<head>
안에 저거 넣어주기
3.5
javascript
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDos = [];
function paintToDo(text){
const li = document.createElement("li");
const delBtn = document.createElement("button");
delBtn.innerText = "❌";
const span = document.createElement("span");
span.innerText = text;
li.appendChild(span);
li.appendChild(delBtn);
toDoList.appendChild(li);
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDoObj = {
text: text,
id: toDos.length + 1
};
toDos.push(toDoObj);
}
결과
li에게도 id를 할당할거야. 그래야 나중에 버튼을 클릭했을 때 어떤 li를 지워야 하는지 알 수 있을 거니까
위 코드 좀 더 보기 이쁘게 + li에게도 id할당
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDos = [];
function paintToDo(text){
const li = document.createElement("li");
const delBtn = document.createElement("button");
const span = document.createElement("span");
const newId = toDos.length + 1;
delBtn.innerText = "❌";
span.innerText = text;
li.appendChild(span);
li.appendChild(delBtn);
li.id = newId;
toDoList.appendChild(li);
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDoObj = {
text: text,
id: newId
};
toDos.push(toDoObj);
}
결과
값을 입력하고 요소 검사 해보면 저렇게 id가 잘 부여되는 모습을 볼 수 있어
Q. todo를 왜 이런식으로 저장하는거야?
A. local storage에도 todo를 저장해둬야 하기 때문
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDos = [];
function saveToDos(){
localStorage.setItem(TODOS_LS, toDos);
}
function paintToDo(text){
const li = document.createElement("li");
const delBtn = document.createElement("button");
const span = document.createElement("span");
const newId = toDos.length + 1;
delBtn.innerText = "❌";
span.innerText = text;
li.appendChild(span);
li.appendChild(delBtn);
li.id = newId;
toDoList.appendChild(li);
//해야할 일을 생성했을 때 배열에 추가되도록.
const toDoObj = {
text: text,
id: newId
};
toDos.push(toDoObj);
//꼭 toDos안에 집어넣은 이후에 불러야함.
saveToDos();
}
결과
근데 보니까 [object Object]
로 되어있네? 이런걸 원했던 게 아닌데!
이유) local stroage에는 자바스크립트의 data를 저장할 수 없어 오직 string만 저장 가능.
자바스크립트는 local storage에 있는 모든 데이터를 string으로 저장하려고 함.
=> 그래서 우리는 object가 string이 되도록 만들어야해.
function saveToDos(){
localStorage.setItem(TODOS_LS, JSON.stringify(toDos));
}
JSON.stringify는 자바스크립트 object를 string으로 바꿔줌
결과
toDos를 불러오는 작업
function loadToDos(){
const loadedToDos = localStorage.getItem(TODOS_LS);
if(loadedToDos !== null){
console.log(loadedToDos);
}
}
결과
콘솔창에 이렇게 뜸.
[{"text":"asdf","id":1},{"text":"asdf","id":2}]
문제는 불러온게 string이라는거야.
tip) JSON은 object -> string, string -> object 둘 다 변환 가능
function loadToDos(){
const loadedToDos = localStorage.getItem(TODOS_LS);
if(loadedToDos !== null){
console.log(loadedToDos);
const parsedToDos = JSON.parse(loadedToDos);
console.log(parsedToDos);
}
}
결과
모든 todo항목들에 대해서, 즉 parsedToDos 안에 있는 것들에 대해서 printToDo function실행
forEach는 기본적으로 함수를 실행하는데 array에 담겨있는 것들 각각에 한번씩 함수를 실행시켜 주는거임
function loadToDos(){
const loadedToDos = localStorage.getItem(TODOS_LS);
if(loadedToDos !== null){
const parsedToDos = JSON.parse(loadedToDos);
parsedToDos.forEach(function(toDo) {
console.log(toDo.text);
})
}
}
결과
할일 저장하면 저렇게 콘솔에 뜸.
창 나가기 하고나서 다시 틀면 전에 입력했던 값이 저장되어 있어서 전에 입력했던 할일 값이 콘솔에 뜸.
function은 따로 떼서 밖에다가 둘 수도 있음
function something(toDo) {
console.log(toDo.text);
}
function loadToDos(){
const loadedToDos = localStorage.getItem(TODOS_LS);
if(loadedToDos !== null){
const parsedToDos = JSON.parse(loadedToDos);
parsedToDos.forEach(something);
}
}
이렇게^^ㅎㅎ
toDos에 있는 각각에 대해서 function실행
결과는 아까랑 똑같아.
하지만 니꼬쌤과 나는 후자 방법보단 전자 방법으로 할거얌
function loadToDos(){
const loadedToDos = localStorage.getItem(TODOS_LS);
if(loadedToDos !== null){
const parsedToDos = JSON.parse(loadedToDos);
parsedToDos.forEach(function(toDo) {
paintToDo(toDo.text);
})
}
}
결과
wow 이제 새로고침해도 todolist가 안사라지는 모습
Author And Source
이 문제에 관하여(자바스크립트 3.4~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@123cjstj/자바스크립트-3.4저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)