<!--html-->
<form id="todo-form">
<input type="text" placeholder="Write a To Do and Press Enter" />
</form>
<ul id="todo-list"></ul>
// JS
const toDoForm = document.getElementById("todo-form");
const toDoInput = document.querySelector("#todo-form input");
// => const toDoInput = toDoForm.querySelector("input");
const toDoList = document.getElementById("todo-list");
function handleToDoSubmit(event) {
event.preventDefault(); // toDoForm 의 submit 기능(새로고침)을 막는다.
const newTodo = toDoInput.value; // todo input의 값을 새로운 변수에 저장 후
toDoInput.value = ""; // 다시 공백으로
paintTodo(newTodo); // paintTodo에 보내기
}
function paintTodo(newTodo) {
const li = document.createElement("li"); // createElement에는 ""
const span = document.createElement("span"); // li에는 innerText 기능이 없기 때문에 span하나 만들기
li.appendChild(span); // appendChild 에는 "" x
span.innerText = newTodo;
toDoList.appendChild(li);
}
toDoForm.addEventListener("submit", handleToDoSubmit);
Delete Button 추가 , button은 click event를 기다리고 있어야 한다.
function deleteTodo(event) {
const li = event.target.parentElement; // button의 부모인 li가 저장됨
li.remove(); // const li 제거
}
function paintTodo(newTodo) {
const li = document.createElement("li"); // createElement에는 ""
const span = document.createElement("span"); // li에는 innerText 기능이 없기 때문에 span하나 만들기
span.innerText = newTodo;
const button = document.createElement("button");
button.innerText = "❌";
button.addEventListener("click", deleteTodo);
li.appendChild(span); // appendChild 에는 "" x
li.appendChild(button);
toDoList.appendChild(li);
}
deleteTodo
function은 click event의 정보를 받는다.newTodo가 생성될 때마다 toDos array에 push 후 텍스트 값을 localStroage에 저장
const toDos = [];
// handleToDosubmit에 추가
toDos.push(newTodo);
saveToDos();
function saveToDos() {
localStorage.setItem("todos", JSON.stringify(toDos));
}
JSON.stringify
:JS Object나 array 또는 어떤 JS 코드건 간에 string으로 만들어준다.새로고침하면 localStorage 에 있는 ToDo들이 사라진다
-> localStroage에 있는 값들을 추출해서 배열로 바꾼 후 배열의 원소에 각각 paintToDo함수를 적용시키자
const parsedToDos = JSON.parse(savedToDos);
function sayHello(item) {
console.log("this is the turn of ", item);
}
parsedToDos.forEach(sayHello);
--------------------------------
parsedToDos.forEach((item) => console.log("this is the turn of ", item));
ToDo들이 남긴 남는데 새로 추가한 것들만 남게된다.
-> toDos array가 항상 빈 값으로 시작하기 때문!
-> toDos array를 const에서 let으로 바꾸고 localStorage에 toDo들이 있으면 ToDo 안에 parsedTodo를 넣는다
let toDos = [];
const savedToDos = localStorage.getItem(TODOS_KEY); // 이전 ToDo 가져오기 (string)
if (savedToDos != null) {
const parsedToDos = JSON.parse(savedToDos); // 배열로 다시..
toDos = parsedToDos; // 이전 ToDo 들을 채워주기
parsedToDos.forEach(paintTodo); // 새로고침해도 LS에 남기기
}
delete 버튼으로 element를 지울 때 LS에서도 그 원소가 지워지게 해야한다.
-> object 타입을 활용하여 ToDo들에게 ID를 주자
const newTodoObj = { // object type
text: newTodo,
id: Date.now()
};
toDos.push(newTodoObj);
paintTodo(newTodoObj);
후에 각 원소의 id 를 li element에 넘긴다
function deleteTodo(event) {
const li = event.target.parentElement; // button의 부모인 li가 저장됨
li.remove(); // const li 제거
toDos = toDos.filter((toDo) => toDo.id != parseInt(li.id));
saveToDos();
}
navigator.geolocation.getCurrentPosition(onGeoOK, onGeoError);
const API_KEY = "2669fa95f6aafa5e0e324b76025fc3be";
function onGeoOK(position) {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${API_KEY}&units=metric`;
fetch(url)
.then((response) => response.json())
.then((data) => {
const weather = document.querySelector("#weather span:first-child");
const city = document.querySelector("#weather span:last-child");
city.innerText = data.name;
weather.innerText = `${data.weather[0].main} / ${data.main.temp}`;
});
}
function onGeoError() {
alert("can't find you.");
}
navigator.geolocation.getCurrentPosition(onGeoOK, onGeoError);