Computer Science/FrontEnd

노마드 코더 JS | #4 Login

토마토. 2022. 2. 22. 14:08

이제 애플리케이션 빌드를 시작한다. 

 

#4.0 Input Values

<!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">
        <link rel="stylesheet" href="style.css">
        <title>Document</title>
    </head>
    <body>
        <div id="login-form" class="form">
            <input type="text" placeholder="What is your name?"/>
            <button>Log In</button>
        </div>
        <script src="app.js"></script>
    </body>
</html>

 

03:36 보던 중

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const loginButton = loginForm.querySelector("button");

이건 아래 코드랑 동일함

const loginInput = loginForm.querySelector("#login-form input");
const loginButton = loginForm.querySelector("#login-form button");

user가 버튼을 클릭하는 걸 감지하는 방식

= click event

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const loginButton = loginForm.querySelector("button");

function onLoginBtnClick(){
    console.dir(loginInput);
    console.log("click!");
    alert("click");
}
loginButton.addEventListener("click",onLoginBtnClick);

input 안에 있는 값을 console.dir에서 value라는 값으로 알아낼 수 있다.

value property를 이용해서 input에 있는 내용을 가져올 수 있다. 

console.log(loginInput.value);

 

user가 어떤 이름을 입력했을 때만 할 수 있도록 if else 활용하기

 

#4.1 Form Submission

=> username의 유효성

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const loginButton = loginForm.querySelector("button");

function onLoginBtnClick(){
    const inputValue = loginInput.value;
    if (inputValue == ""){
        alert("No input value");
    }
    else {
        console.log("click!");
        alert("hi "+loginInput.value);
    }
}
loginButton.addEventListener("click",onLoginBtnClick);

 

길이 유효성 검사

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const loginButton = loginForm.querySelector("button");

function onLoginBtnClick(){
    const username = loginInput.value;
    if (username == ""){
        alert("No input value");
    }
    else if (username.length > 15){
        alert("Your name is too long")
    }
    else {
        console.log("click!");
        alert("hi "+username);
    }
}
loginButton.addEventListener("click",onLoginBtnClick);

 

if else 말고 브라우저 자체 기능을 활용하고 싶다.

=> 절대 유저를 믿지 말 것

 

html form에 다양한 것을 할 수 있음

<input required maxlength="15" type="text" placeholder="What is your name?" />

 

Form이 아니기 때문에

input 유효성 검사를 위해서는 input이 form 안에 있어야 한다. 

 

login을 누르면 submit 되고 있다. 

엔터를 누르고, input이 존재하지 않는다면, form이 자동으로 submit 된다. 

더 이상 click을 고려하고 싶다. 

 

새로고침 하지 않고 user 정보를 저장하도록

 

#4.2 Events 10분

=> submit event에 listen 해주어야 함

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");

function onLoginSubmit(){
    const username = loginInput.value;
    console.log(username);
    
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);

 

새로고침을 없애주고 싶음

즉시 실행된다는 뜻

 

브라우저는 onLoginSubmit 함수를 호출하고,

실행시키지만, 

특정한 정보를 전달해주고 있다. 

function onLoginSubmit(info){
    //const username = loginInput.value;
    //console.log(username);
    info.preventDefault();   
    console.log(info);
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);

+ preventDefault();는 브라우저의 기본적인 수행 동작을 멈추도록 하는 것이다. 

페이지를 새로고침 하도록 되어있다. 

 

그 정보는 이런 형태

이 argument로 여러 가지를 할 수 있게 된다. 

onLoginSubmit 하나의 argument를 받아오도록 하고 있다. 

SubmitEvent {isTrusted: true, submitter: button, type: 'submit', target: form#login-form, currentTarget: form#login-form, …}
isTrusted: true
bubbles: true
cancelBubble: false
cancelable: true
composed: false
currentTarget: null
defaultPrevented: true
eventPhase: 0
path: (5) [form#login-form, body, html, document, Window]
returnValue: false
srcElement: form#login-form
submitter: button
target: form#login-form
timeStamp: 1477.2000000476837
type: "submit"
[[Prototype]]: SubmitEvent

 

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");

function onLoginSubmit(event){
    event.preventDefault();   
    const username = loginInput.value;
    console.log(username);
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);

 

#4.3 Events part Two 8분

=> JS를 이용해서 기본 동작을 막을 것이다. 

이전 영상에서는 form의 submit을 막았음

=> 링크의 기본 동작은 클릭으로 다른 곳에 이동하는 것

function handleLinkClick(){
    alert("clicked");
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);
link.addEventListener("click", handleLinkClick);

일단 함수에 적어둔 alert가 실행되고

그 다음에 확인을 누르면 그 링크로 이동한다. 

 

디폴트를 막아야 할 때가 있다. 무엇이 클릭되었는지 확인해야 하는 경우들

첫번째 인자는 event에 관한 정보

function handleLinkClick(event){
    console.log(event);
    alert("clicked");
    
}

넣어서 확인해보니, 클릭할 때마다 클릭 이벤트가 달라진다. 

PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}

이벤트로부터 받을 수 있는 이벤트가 굉장히 다양하다

PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}
isTrusted: true
altKey: false
altitudeAngle: 1.5707963267948966
azimuthAngle: 0
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable: true
clientX: 48
clientY: 42
composed: true
ctrlKey: false
currentTarget: null
defaultPrevented: true
detail: 1
eventPhase: 0
fromElement: null
height: 1
isPrimary: false
layerX: 48
layerY: 42
metaKey: false
movementX: 0
movementY: 0
offsetX: 40
offsetY: 10
pageX: 48
pageY: 42
path: (5) [a, body, html, document, Window]
pointerId: 1
pointerType: "mouse"
pressure: 0
relatedTarget: null
returnValue: false
screenX: 125
screenY: 122
shiftKey: false
sourceCapabilities: InputDeviceCapabilities {firesTouchEvents: false}
srcElement: a
tangentialPressure: 0
target: a
tiltX: 0
tiltY: 0
timeStamp: 1518.5
toElement: null
twist: 0
type: "click"
view: Window {window: Window, self: Window, document: document, name: '', location: Location, …}
which: 1
width: 1
x: 48
y: 42
[[Prototype]]: PointerEvent

 

재생을 멈추지 말고 다양한 자극을 주기

 

#4.4 Getting Username 11분

=> login 엔터 누른 뒤에 login form을 없애고 싶을 때

옵션 1. html 삭제

옵션 2. css 이용해서 감추기

style.css

.hidden {
    display:none;
}

app.js

function onLoginSubmit(event){
    event.preventDefault();   
    const username = loginInput.value;
    loginForm.classList.add("hidden");
    console.log(username);
}

 

+ 여기에다가 html 요소를 추가하기

h1 내용을 비워둔다. 

        <h1 class="hidden">Hi</h1>
const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const link = document.querySelector("a");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";

function onLoginSubmit(event){
    // hide form
    event.preventDefault();   
    loginForm.classList.add(HIDDEN_CLASSNAME);
    const username = loginInput.value;
    // show greeting
    console.log(username);
    greeting.innerText = "Hello " + username;
    greeting.classList.remove(HIDDEN_CLASSNAME);
}

function handleLinkClick(event){
    event.preventDefault();   
    console.log(event);
    alert("clicked");
    
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);
link.addEventListener("click", handleLinkClick);

오와아앙

 

+ string 생성하는 법

    greeting.innerText = `Hello ${username}`;

키보드에서 이 키 처음 써본다..

string 안에 넣고 싶으면 ${}

그리고 시침 ``

 

#4.5 Saving Username 7분

=> 아~~~주 기본적인 것 user 기억하기

localStorage라는 기능을 이용하면 된다. 

localStorage.setItem('myCat', 'Tom');

Window.localStorage - Web API | MDN (mozilla.org)

나중에 더 써보기!!!

localStorage.setItem('myCat', 'Tom');
Storage {myCat: 'Tom', length: 1}

 

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const link = document.querySelector("a");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";

function onLoginSubmit(event){
    // hide form
    event.preventDefault();   
    loginForm.classList.add(HIDDEN_CLASSNAME);
    const username = loginInput.value;
    localStorage.setItem("username", username);
    // show greeting
    console.log(username);
    greeting.innerText = `Hello ${username}`;
    greeting.classList.remove(HIDDEN_CLASSNAME);
    
}

function handleLinkClick(event){
    event.preventDefault();   
    console.log(event);
    alert("clicked");
}
// 엔터를 누르거나 버튼 클릭할 때 발생
loginForm.addEventListener("submit", onLoginSubmit);
link.addEventListener("click", handleLinkClick);

 

 

#4.6 Loading Username 10분

=> 만약 localStorage에 username이 있다면, 

=> form 보여주지 않고 바로 hello 하기

const savedUsername = localStorage.getItem(USERNAME_KEY);

if (savedUsername == null){
    // show the form
}
else {
    // show the greeting
}

기본 로직은 이렇게 흘러감

 

const loginForm = document.querySelector("#login-form");
const loginInput = loginForm.querySelector("input");
const link = document.querySelector("a");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";

function onLoginSubmit(event){
    // hide form
    event.preventDefault();   
    loginForm.classList.add(HIDDEN_CLASSNAME);
    const username = loginInput.value;
    localStorage.setItem(USERNAME_KEY, username);
    // show greeting
    console.log(username);
    greeting.innerText = `Hello ${username}`;
    greeting.classList.remove(HIDDEN_CLASSNAME);
    
}

function handleLinkClick(event){
    event.preventDefault();   
    console.log(event);
    alert("clicked");
}

function paintGreetings(HIDDEN_CLASSNAME,savedUsername){
    loginForm.classList.add(HIDDEN_CLASSNAME);
    greeting.classList.remove(HIDDEN_CLASSNAME);
    greeting.innerText=`Hello ${savedUsername}`;
}
// 엔터를 누르거나 버튼 클릭할 때 발생
const savedUsername = localStorage.getItem(USERNAME_KEY);

if (savedUsername == null){
    // show the form
    console.log("user is null");
    loginForm.classList.remove(HIDDEN_CLASSNAME);
    loginForm.addEventListener("submit", onLoginSubmit);
}
else {
    console.log("user is not null");
    // show the greeting
    paintGreetings(HIDDEN_CLASSNAME,savedUsername);
}

link.addEventListener("click", handleLinkClick);

 

#4.7 Super Recap 13분

- css로 form hidden 

- 브라우저 api local storage

- js로 null -> form / else -> greeting

- 으로 받아줌

 

흥미롭군..