JS의 학습을 하게되어 학습 과정을 남겨 보려고 합니다.
"바닐라JS 챌린지" 강의로 노마드의 니콜라스 선생님의 강의입니다.
JS로 사용하는 front중 가장 기본인 vanila JS를 활용한 간단한 웹사이트 제작입니다.
결과물

아래와 같이
HTML, CS, JS 세가지의 파일로 나눠서 구성했습니다.
브라우저에 세가지 파일을 해석할수 있는 컴파일러와 엔진이 존재한다.
개발자 모드에서 console에 JS 코드를 직접 typing 할 수 있는 이유이다.
CS와 JS 파일은 독립적으로 실행되지 않으며, HTML 파일과 같이 import 되어 사용된다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="css/style.css" />
<title>Momentum App</title>
</head>
<body>
<h2 id="clock">00:00:00</h2>
<form class="hidden" id="login-form">
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
<h1 id="greeting" class="hidden"></h1>
<form id="todo-form">
<input type="text" placeholder="Write a To Do and Press Enter" required />
</form>
<ui id="todo-list">
<!-- <li>
<span>text</span>
<button>X</button>
</li> -->
</ui>
<div id="quote">
<span></span>
<span></span>
</div>
<div id="weather">
<span></span>
<span></span>
</div>
<script src="js/greetings.js"></script>
<script src="js/clock.js"></script>
<script src="js/quotes.js"></script>
<script src="js/background.js"></script>
<script src="js/todo.js"></script>
<script src="js/weather.js"></script>
</body>
</html>
.hidden {
display: none;
}
'link rel="stylesheet" href="css/style.css"'
HTML의 해당 링크를 통해서 CS 파일을 import 시킨다.
const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const loginButton = loginForm.querySelector("button");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";
function onLoginSubmit(event) {
event.preventDefault();
const usernameThatTheUserWrote = loginInput.value;
loginForm.classList.add(HIDDEN_CLASSNAME);
localStorage.setItem(USERNAME_KEY, usernameThatTheUserWrote);
paintGreetings();
}
function paintGreetings() {
const username = localStorage.getItem(USERNAME_KEY);
greeting.innerText = `Hello ${username}`;
greeting.classList.remove(HIDDEN_CLASSNAME);
}
const savedUsername = localStorage.getItem(USERNAME_KEY);
console.log(savedUsername);
if (savedUsername == null) {
// show the form
loginForm.classList.remove(HIDDEN_CLASSNAME);
loginForm.addEventListener("submit", onLoginSubmit);
} else {
// show the greetings
paintGreetings();
}
clock.js
const clock = document.querySelector("h2#clock");
function getClock() {
const date = new Date();
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
clock.innerText = `${hours}:${minutes}:${seconds}`;
}
// 처음 시작 딜레이를 막기위함
getClock();
setInterval(getClock, 1000);
// console.log(clock.innerText);
quotes.js
const quotes = [
{
quote: "The way to get started is to quit talking and begin doing.",
author: "Walt Disney",
},
// ... 이하 생략
];
const quote = document.querySelector("#quote span:first-child");
const author = document.querySelector("#quote span:last-child");
// 내가 원하는 숫자를 곱하면 0~ 숫자까지 랜덤으로 나온다.
const todaysQuote = quotes[Math.floor(Math.random() * quotes.length)];
quote.innerText = todaysQuote.quote;
author.innerText = todaysQuote.author;
quotes.js
const images = ["1.jpeg", "2.jpeg", "3.jpeg"];
const chosenImage = images[Math.floor(Math.random() * images.length)];
const bgImage = document.createElement("img");
bgImage.src = `img/${chosenImage}` ;
document.body.appendChild(bgImage);
img/${chosenImage} 이미지 이름을 배정한다.todo.js
const toDoForm = document.querySelector("#todo-form");
const toDoInput = document.querySelector("#todo-form input");
const toDoList = document.querySelector("#todo-list");
const TODOS_KEY = "todos";
let toDos = [];
function saveToDos() {
localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}
function deleteTodo(event) {
const li = event.target.parentElement;
li.remove();
toDos = toDos.filter((toDo) => parseInt(toDo.id) !== parseInt(li.id));
saveToDos();
}
function paintToDo(newTodo) {
const li = document.createElement("li");
li.id = newTodo.id;
const span = document.createElement("span");
span.innerText = newTodo.text;
const button = document.createElement("button");
button.innerText = "x";
button.addEventListener("click", deleteTodo);
li.appendChild(span);
li.appendChild(button);
toDoList.appendChild(li);
}
function handleToDoSubmit(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
const newTodoObj = {
text: newTodo,
id: Date.now(),
};
toDos.push(newTodoObj);
paintToDo(newTodoObj);
saveToDos();
}
toDoForm.addEventListener("submit", handleToDoSubmit);
const savedToDos = localStorage.getItem(TODOS_KEY);
if (savedToDos !== null) {
const parseToDos = JSON.parse(savedToDos);
toDos = parseToDos;
parseToDos.forEach(paintToDo);
}
weather.js
const WeatherForm = document.querySelector("#weather");
const Name = WeatherForm.querySelector("span:first-child");
const Weather = WeatherForm.querySelector("span:last-child");
function onGeoOk(position) {
// console.log(position);
const lat = position.coords.latitude;
const lng = position.coords.longitude;
const key = "";
const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${key}&units=metric`;
console.log(url);
// URL을 부른다.
fetch(url)
.then((response) => response.json())
.then((data) => {
const name = data.name;
const weather = data.weather[0].main;
Name.innerText = name;
Weather.innerText = weather;
});
}
function onGeoError() {
alert("찾을수 없습니다. 에러 !");
}
navigator.geolocation.getCurrentPosition(onGeoOk, onGeoError);
순수 JS인 vanilaJS를 활용하여 Dom을 조작하고, 화면의 구성했다.
JQuery, framework 모두 이 순수 JS를 기반으로 동작하기에 중요한 학습 포인트라고 생각한다.
다음 포스팅에서는 이 코드를 바탕으로 JQuery로 변경하여 구성해보겠습니다.