#4.4 Getting Username
submit ๋ฒํผ์ ํด๋ฆญํ์ ๋, form ์์ฒด๋ฅผ ์ฌ๋ผ์ง๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด 2๊ฐ๊ฐ ์๋ค.
โ form ํ๊ทธ ์์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ
โก css์์ display:none; ์์ฑ์ ์ถ๊ฐํด์ฃผ๋ ๊ฒ
์๋๋ form์์ ์ ๋ ฅ๊ฐ์ ๋ฐ์์ค๋ฉด form์ ์ ๊ฑฐํ๊ณ , ๋ฐ์์จ ์ ๋ ฅ๊ฐ์ ์ถ๋ ฅํ๋ ์ฝ๋๋ค.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Momentum</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<form id="login-form">
<input required maxlength="15" type="text" placeholder="What is your name?" />
<input type="submit" value="Login"/>
</form>
<h1 id="greeting" class="hidden"></h1>
<script src="app.js"></script>
</body>
</html>
login-form์์ ์ ๋ ฅ๊ฐ์ ๋ฐ์์ค๋ฉด form ํ๊ทธ๋ ์์ ์ฌ๋ผ์ง ๊ฒ์ด๊ณ , h1 ํ๊ทธ๊ฐ ๋ณด์ฌ์ง๊ฒ ๋ ๊ฒ์ด๋ค.
style.css ์๋ ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
.hidden{
display:none;
}
/* ์ข ๋น์ทํ ์์ฑ์๋ display:hidden;์ด ์์ง๋ง, ์ด๋ ๊ทธ๋ฅ ๋ณด์ด์ง ์๊ฒ ์จ๊ฒจ์ฃผ๋ ๊ฒ ๋ฟ
ํด๋น ์์๊ฐ ์ฐจ์งํ๋ ๊ณต๊ฐ๋ ๊ทธ๋๋ก์ด๋ฉฐ ๋ฐ๋ผ์ html์์ ์์ ํ ์ ๊ฑฐ๋๊ฒ ์๋๋ค. */
app.js ์์ form์ ์์ฑํ ๊ฐ์ ๋ณ์์ ๋ด๊ณ , loginForm์ ์ด ํด๋์ค๋ฅผ ์ถ๊ฐํด์ค ๊ฒ์ด๋ค.
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting")
// ์ผ๋ฐ์ ์ผ๋ก string๋ง ํฌํจ๋์ด ์๊ณ , ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์์ ๋ณ์๋ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ค.
// ๋ฌธ์์ด์ ์คํ๋ javascript๊ฐ ๋ฌด์ํ์ง๋ง, ๋ณ์๋ช
์ ์คํ๋ ์ง์ ํด์ฃผ๊ธฐ ๋๋ฌธ์
// 2๋ฒ ์ด์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ๋ณ์์ ๋ด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
const HIDDEN_CLASSNAME = "hidden";
function onLoginSubmit(event){
// submit ๋ฒํผ ํด๋ฆญ ์ ์๋์ผ๋ก ์๋ก๊ณ ์นจ๋์ด ์ ๋ณด๊ฐ ๋ ์๊ฐ๋ ๊ฒ์ ๋ฐฉ์ง
event.preventDefault();
const username = loginInput.value;
// loginForm์ ์ ๊ฑฐํ๋ค.
loginForm.classList.add(HIDDEN_CLASSNAME);
// h1 ํ๊ทธ์ ์๋ hidden ํ๊ทธ๋ฅผ ์ง์์ผ๋ก์จ ๋ณด์ฌ์ง๊ฒ ํ๋ค.
greeting.classList.remove(HIDDEN_CLASSNAME);
// h1 ํ๊ทธ ์์ hello + username์ ์ถ๋ ฅํ๋ค.
greeting.innerText = `Hello ${username}`;
}
loginForm.addEventListener("submit", onLoginSubmit);
#4.5 Saving Username
๋ฌด์ธ๊ฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๋ค. ์ ํ๋ธ์ ๋ณผ๋ฅจ์ ์กฐ์ ํ๊ณ ์๋ก๊ณ ์นจํ์ ๋ ๊ทธ ์ค์ ์ด ์ ์ง๋๋ ๊ฒ์ด ์ด์ ํด๋นํ๋ค. ์์ ์ฝ๋์์๋ user๋ฅผ ์ ์ฅํด๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฒ์ด๋ค.
๊ทธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ API๊ฐ localStorage๋ค.
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
localStorage์ ๋ค์ด์๋ ๊ฒ์ ๋ณด๊ณ ์ถ๋ค๋ฉด ๊ฐ๋ฐ์ ๋๊ตฌ - Application - Storage - Local Storage์์ ํ์ธํ๋ฉด ๋๋ค. Storage์๋ Session, indexedDB, WebSQL, ์ฟ ํค, Token ๋ฑ๋ ํ์ธํ ์ ์๋ค.
- setItem() : local storage์ ์ ๋ณด ์ ์ฅ
- getItem() : local storage์ ์ ์ฅํ ๊ฐ์ ๋ถ๋ฌ์ด
- removeItem() : local storage์ ์ ์ฅํ ๊ฐ์ ์ญ์
local storage์๋ ์ค๋ฅธ์ชฝ ์บก์ณ์ ๊ฐ์ด key, value ํ์์ผ๋ก ์ ์ฅ๋๋ค.
localStorage.setItem("username", "hayeon");
localStorage.getItem("username");
localStorage.removeItem("username");
#4.6 Loading Username
์ด์ local storage๋ฅผ ์ด์ฉํด username์ ๊ดํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
1) ๋จผ์ onLoginSubmit ํจ์์ localStorage์ username์ ์ ์ฅํ๋ค.
function onLoginSubmit(event){
// ์ค๋ต
localStorage.setItem(USERNAME_KEY, username);
}
2) addEventListener๋ฅผ ํ๊ธฐ ์ ์ ํ์ธํ๋ค.
const savedUsername = localStorage.getItem(USERNAME_KEY);
if(savedUsername === null){
} else {
}
(1) local storage๊ฐ ๋น์ด ์์ผ๋ฉด form์ ๋ณด์ฌ์ฃผ๋ฉด์ ์ด๊ธฐํํ๋ค.
๊ทธ๋ฌ๋ ์ง๊ธ์ ์ฝ๋๋ก๋ ์์ if-else ๊ตฌ๋ฌธ๊ณผ ๊ด๊ณ์์ด form ํ๊ทธ๊ฐ ๋ฌด์กฐ๊ฑด ๋ณด์ฌ์ง๋ฏ๋ก, index.html์์ form ํ๊ทธ์๋ class="hidden"์ ์ถ๊ฐํ๋ค.
// ์ด if๊ตฌ๋ฌธ๊ณผ ๊ด๊ณ์์ด form์ด ํ์๋๋ฏ๋ก form์๋ hidden ํด๋์ค ์ถ๊ฐ
if(savedUsername === null){
// show the form
// ๋ง์ฝ local storage์ ์ ์ฅ๋ ๊ฐ์ด ์๋ค๋ฉด, form ํ๊ทธ์ hidden ํด๋์ค ์ ๊ฑฐ
loginForm.classList.remove(HIDDEN_CLASSNAME);
//
loginForm.addEventListener("submit", onLoginSubmit);
}
(2) local storage์ ์ ์ ์ ๋ณด๊ฐ ์๋ค๋ฉด form์ ์ง์ฐ๊ณ h1 ํ๊ทธ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค.
else {
// show the greeting
// ๋ง์ฝ local storage์ ์ ์ฅ๋ ๊ฐ์ด ์๋ค๋ฉด, #greeting์ hidden ํด๋์ค ์ ๊ฑฐ
greeting.classList.remove(HIDDEN_CLASSNAME);
// username์ด ์๋๋ผ savedUsername์ธ ์ด์ ๋
// ์ด ๊ตฌ๋ฌธ์๋ username์ด ์๊ธฐ ๋๋ฌธ์(username์ onLoginSubmit ํจ์ ์์์๋ง ์กด์ฌํจ)
// username ๊ฐ์ด ๋์
๋ USERNAME_KEY๋ฅผ ๋ฐ์์จ savedUsername์ ๋์ ์ฌ์ฉํจ.
greeting.innerText = `Hello ${savedUsername}`;
}
์์ฒ๋ผ ์์ฑํ ์ฝ๋์๋ greeting.classList~์ greeting.innerText~ ์ด ๋ ์ค์ด ๋ฐ๋ณต๋๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด ์ด ๋ถ๋ถ์ ์ค๋ณต์ ์ค์ธ๋ค.
function paintGreetings(username){
// ์ฌ๊ธฐ์์์ username์ ๋จ์ง ์ธ์์ผ ๋ฟ์ด๋ฏ๋ก tomato, aibao ๋ฑ๋ฑ ์๋ฌด๊ฑฐ๋ ํด๋ ์๊ด์๋ค..
greeting.innerText = `Hello ${username}`;
greeting.classList.remove(HIDDEN_CLASSNAME);
}
app.js
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";
function onLoginSubmit(event) {
event.preventDefault();
loginForm.classList.add(HIDDEN_CLASSNAME);
const username = loginInput.value;
localStorage.setItem(USERNAME_KEY, username);
paintGreetings(username);
}
function paintGreetings(username) {
greeting.innerText = `Hello ${username}`;
greeting.classList.remove(HIDDEN_CLASSNAME);
}
const savedUsername = localStorage.getItem(USERNAME_KEY);
if (savedUsername === null) {
loginForm.classList.remove(HIDDEN_CLASSNAME);
loginForm.addEventListener("submit", onLoginSubmit);
} else {
paintGreetings(savedUsername);
}
console.log(savedUsername);
#6.0 Quotes
์ฝ๋ ์ฑ๋ฆฐ์ง๋ฅผ ํ ๋ ์ฐธ๊ณ ํด์ผ ํ๋ค๊ณ ํด์ ์ฌ๊ธฐ๋ค๊ฐ ์ ๋ฆฌ
index.html, quotes.js : https://github.com/nomadcoders/javascript-for-beginners/commit/0c6d246bd1fc5e3a4a55ef00aa08fd1b9420ce94
clock.js : https://github.com/nomadcoders/javascript-for-beginners/blob/master/js/clock.js
greeting.js : https://github.com/nomadcoders/javascript-for-beginners/blob/a3a25c939aea604f071cebcaab3e3895c91f5dbe/js/greetings.js
style.css๋ ์์ ๊ฐ์
(์ ์ ์ด ๊ฐ์ ์ค์ต์๋ index.html๊ณผ quotes.js๋ง ์ฐ๊ธด ํ๋ค.)
index.html
<body>
<form class="hidden" id="login-form">
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
<h2 id="clock">00:00:00</h2>
<h1 class="hidden" id="greeting"></h1>
<div id="quote">
<span></span>
<span></span>
</div>
<script src="js/greetings.js"></script>
<script src="js/clock.js"></script>
<script src="js/quotes.js"></script>
</body>
id๊ฐ quote์ธ divํ๊ทธ ๋ด์ spanํ๊ทธ๋ ๋ช ์ธ๊ณผ ์๊ฐ๊ฐ ๊ฐ๊ฐ ๋ด๊ธธ ๊ฒ์ด๋ค.
quotes.js
const quotes = [
// ๋ช
์ธ๋ค
];
const quote = document.querySelector("#quote span:first-child");
const author = document.querySelector("#quote span:last-child");
const todaysQuote = quotes[Math.floor(Math.random() * quotes.length)];
quote.innerText = todaysQuote.quote;
author.innerText = todaysQuote.author;
์ด์ ๋ช ์ธ์ #quote์ ์ฒซ๋ฒ์งธ span ํ๊ทธ๋ฅผ, ์๊ฐ์๋ ๋ง์ง๋ง span ํ๊ทธ๋ฅผ ๊ฐ์ ธ์๋ค.
์ด ๋ ๋ช ์ธ array์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ quotes[0] ๋ถํฐ [9]๊น์ง ๊ฐ์ ธ์์ผ ํ๋๋ฐ, ์ด๋ math module์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ ์ค Math.random()์ 0๋ถํฐ 1 ์ฌ์ด์ ๋๋คํ ์ซ์๋ฅผ ์ ๊ณตํ๋๋ฐ, 0~9๊น์ง์ ์ซ์๊ฐ ํ์ํ๋ฏ๋ก quotes.length๋ฅผ ๊ณฑํด์ฃผ๋ฉด 0๋ถํฐ 10๋ฏธ๋ง์ ์ซ์๋ฅผ ์ ๊ณตํด์ค ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์์๋ถ๋ถ์ ์ ๋ถ ๋นผ์ค ํจ์ ์ธ ๊ฐ๋ ์กด์ฌํ๋ค.
Math.floor()์ ์์์ ์ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ [0]~[n-1]๊น์ง,
Math.ceil()์ ์์์ ์ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์ [1]~[n]๊น์ง,
Math.round()๋ ์์์ ์ ๋ฐ์ฌ๋ฆผํ๊ธฐ ๋๋ฌธ์ [0]~[n]๊น์ง ๋์จ๋ค.
์ฐ๋ฆฌ๋ 0~9๊น์ง์ ์ ์๋ฅผ ์ป๊ณ ์ถ์ผ๋ฏ๋ก floor()์ ์ด์ฉํ๋ค. (๋ง์ฝ ceil์ด๋ round๋ฅผ ์ด์ฉํ๊ฒ๋๋ฉด Math.random() * quotes.length์ ๊ฐ์ด 9.***๊ฐ ๋์์ ๋ ceil์ ๋ฌด์กฐ๊ฑด 10์, round๋ ๊ทธ ์์ ๋ฐ๋ผ 10์ ์ถ๋ ฅํ ์๋ ์์ผ๋ฉฐ, ๊ฐ์ด 0.****๊ฐ ๋์ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ceil์ ๋ฌด์กฐ๊ฑด 1์, round๋ 1์ ์ถ๋ ฅํ ์๋ ์๊ธฐ ๋๋ฌธ์ floor()์ ์ฌ์ฉํ๋ค.)
๊ทธ๋ฆฌ๊ณ innerText๋ก todaysQuote์ quote์ author๋ฅผ ๊ฐ๊ฐ ๋ด๋๋ค.
'javascript > ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DAY 11 (0) | 2023.01.05 |
---|---|
DAY 10 (0) | 2023.01.04 |
DAY 5 (0) | 2022.12.30 |
DAY 4 (0) | 2022.12.30 |
DAY 3 (0) | 2022.12.28 |