๐Ÿ”๋…ธ๋งˆ๋“œ์ฝ”๋” Vanilla JS LOGIN

์†Œ์—ฐยท2021๋…„ 7์›” 3์ผ
0

vanillaJS

๋ชฉ๋ก ๋ณด๊ธฐ
5/8

preventDefault

const link = document.querySelector("a");

function linkEvent(event){
    event.preventDefault();
    console.log(event);  
}

link.addEventListener("click", linkEvent);

preventDefault๋Š” ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์—์„œ์˜ ๊ธฐ๋Šฅ์„ ์—†์• ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
์˜ˆ๋ฅผ ๋“ค์–ด a์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์—์„œ ์„ค์ •๋œ ๋งํฌ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ํƒœ๊ทธ์ด๋‹ค
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ด ๋งํฌ๊ฐ€ ์—ฐ๊ฒฐ์ด ์•ˆ๋˜๋„๋ก ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ preventDefault์ด๋‹ค.


LOGIN 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);
    //greeting.innerText = "Hello " + username;                    ๊ฐ™์€ ์ฝ”๋“œ
    //greeting.innerText = `Hello ${username}`;      ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ   ๊ฐ™์€ ์ฝ”๋“œ
    //greeting.classList.remove(HIDDEN_CLASSNAME);   ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ
    paintGreeting(username);
}

์œ„์— ๋‘ innerText ์ฝ”๋“œ๋Š” ๊ฐ™์€ ์—ญํ• . `Hello ${username}` ;์—์„œ ๋‘˜๋Ÿฌ์‹ผ ๊ธฐํ˜ธ ` ` ์ฃผ์˜
submit์ด ์‹คํ–‰๋์„ ๋•Œ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์˜ ๊ธฐ๋Šฅ์„ ๋ง‰๊ธฐ ์œ„ํ•ด preventDefault๋ฅผ ์‚ฌ์šฉ
loginForm์— .hidden์„ ์ถ”๊ฐ€ํ•˜์—ฌ submitํƒ€์ž…์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด loginForm์ด ์‚ฌ๋ผ์ง€๊ฒŒ ํ•จ
loginInput์˜ value๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด username์˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ฆ
localStorage์— "username"(ํ‚ค ๊ฐ’์˜ ์ด๋ฆ„์ผ ๋ฟ์ด๋ฏ€๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)์ด๋ผ๋Š” USERNAME_KEY ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋„๋ก ํ•จ
์ดํ›„์— innerText ` Hello ${username] `; ์œผ๋กœ ์ด๋„ˆํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝ.
์—ฌ๊ธฐ์„œ username์€ ์œ„์—์„œ ์ง€์ •ํ•œ const username = loginInput.value;๊ฐ’์ด ์ €์žฅ๋œ ํ›„์— greeting์— .hidden์„ ์ œ๊ฑฐํ•˜์—ฌ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋„๋ก ํ•จ


function paintGreeting(username){
    greeting.innerText = `Hello ${username}`;
    greeting.classList.remove(HIDDEN_CLASSNAME);
}

์œ„์™€ ์•„๋ž˜์— '๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ'๋“ค์„ function paintGreeting()์œผ๋กœ ๋ฌถ์–ด์ฃผ์–ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค


const savedUsername = localStorage.getItem(USERNAME_KEY);
if(savedUsername === null){
    loginForm.classList.remove(HIDDEN_CLASSNAME);
    loginForm.addEventListener("submit", onLoginSubmit);
} else {
    //greeting.innerText = `Hello ${savedUsername}`;   ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ
    //greeting.classList.remove(HIDDEN_CLASSNAME);     ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ
    paintGreeting(savedUsername);
}

์‚ฌ์ดํŠธ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ๊ฒƒ์€ localStorage์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
์ด๋ฅผ if๋ฌธ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ๋งŒ์•ฝ savedUsername === null ์ด๋ผ๋ฉด loginForn์— .hidden์„ ์ง€์›Œ์ฃผ๊ธฐ
loginForm์—์„œ submit ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด onLoginSubmit ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•จ


HTML

<html lang="ko">

<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">
    <link rel="stylesheet" href="style/style.css">
    <title>Momentum App</title>
</head>

<body>
    <div id="wrap">
        <div id="formTag">
            <form id="login-form" class="hidden">
                <input required maxlength="15" type="text" placeholder="What is your name?">
                <button type="submit">Log In</button>
            </form>
        </div>
        <h1 id="greeting" class="hidden"></h1>
    </div>
    <script src="script/greeting.js"></script>
</body>

</html>

CSS

@charset "UTF-8";

*{
    box-sizing: border-box;
}
.hidden{
    display: none;
}
div#wrap{
    width: 800px;
    height: 400px;
    border: 1px solid #f00;
    background-color: #000;
    margin: 0 auto;
    position: relative;
}
#formTag{
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}
button{
    color:#000;
    font-weight: bold;
    width: 80px;
    height: 30px;
    background-color:deeppink;
    border: none;;
}

input{
    width: 200px;
    height: 30px;
    padding: 10px;
}

h1{
    font-size: 60px;
    text-align: center;
    color:greenyellow;
    margin: 140px 20px;
}

JavaScript

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);
    paintGreeting(username);
    
}

function paintGreeting(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 {
    paintGreeting(savedUsername);
}
profile
์ฝ”๋ฆฐ์ด๐Ÿคช

0๊ฐœ์˜ ๋Œ“๊ธ€