(Nomad Coder) 바닐라 JS를 사용하여 Momentum 클론 코딩하기 (2)_Login


입력 값

이름을 받을 입력과 버튼을 생성한 후 버튼 클릭을 감지하고 입력의 입력 값을 console.log 파일에 기록합니다.

// HTML
<body>
  <div id="login-form">
    <input type="text" placeholder="Whai is your name?" />
    <button>Log In</button>
  </div>

  <!-- html보다 js가 먼저 로드될 경우 js에서 지정한 요소를 못찾을 수 있어, body의 맨 마지막에 작성한다. -->
  <script src="http://oliviakim.m/app.js"></script>
</body>
// JavaScript

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

// * 위의 코드를 더 짧게 바꿔보기
// 이와 같이 document 또는 하나의 element를 통해서 검색이 가능하다.
const loginInput = document.querySelector('#login-form input');
const loginButton = document.querySelector('#login-form button');

// 사용자가 버튼을 클릭했을 때를 감지해서 console.log에 찍는 이벤트 만들어보기
function onLoginBtnClick() {
  console.log(loginInput.value);
}

loginButton.addEventListener('click', onLoginBtnClick);


양식 제출

사용자 이름 유효성 검사를 진행합니다.

  • 사용자 이름은 비워둘 수 없습니다.
  • 사용자 이름은 너무 길면 안 됩니다.

사용자가 입력한 값을 검증하는 것이 좋습니다. 사용자를 믿지 마세요!

조건에 따라 유효성을 검사하기 위해 다음과 같이 JS를 작성할 수 있습니다.

  if(username === '') {
    alert('Please write your name.');
  } else if(username.length > 15) {
    alert('Your name is too long.');
  }

위와 같이 JS로 검증하는 것이 좋다. 이미 가지고 있는 기능일단 사용하기 좋아요 최대 길이를 추가하고 입력에 필요함만들다!

단계, 입력 유효성 검사가 작동하려면 입력이 다음 범위 내에 있어야 합니다.

– 태그가 있습니다. 입력이 없으면 maxlength 및 required가 작동하지 않습니다.

// HTML
<body>
  <form id="login-form">
    <input type="text" maxlength="15" placeholder="Whai is your name?" required />
    <button>Log In</button>
  </form>

  <script src="http://oliviakim.m/app.js"></script>
</body>

위와 같이 유효성 검사를 HTML로 설정한 후 로그인 버튼을 클릭하면, ‘업데이트’ 페이지문제 발생 업데이트 시 입력에 쓰여진 값이 사라집니다. 그 이유는 양식이 제출되었기 때문입니다.

  1. 입력에서 버튼을 누르거나 제출 유형의 입력을 클릭하면 양식이 제출됩니다.
  2. 양식에서 Enter 키를 누르고 더 이상 입력이 없으면 양식이 제출됩니다.

우리가 원하는 것은 브라우저가 사용자 정보를 업데이트하지 않고 저장하는 것입니다. 내가 어떻게 해


이벤트

위 코드에서 문제 상황인 submit 이벤트가 발생하지 않도록 하거나 중간에 개입하여 submit 이벤트가 발생했는지 확인하고자 합니다.

해결책을 찾기 위해 먼저 브라우저가 우리가 작성한 코드를 호출하고 전달하는 방법을 살펴보겠습니다.

loginForm.addEventListener('submit', onLoginSubmit);

위의 코드는 다음과 같은 순서로 진행됩니다.

  1. 제출 이벤트를 인식하는 브라우저는 지정된 onLoginSubmit을 호출합니다.
  2. 이 시점에서 브라우저는 and 함수를 호출합니다. 싸움(인자, 전달인자: 메서드 호출 시 실제로 전달된 값)with call 즉, onLoginSubmit은 onLoginSubmit()처럼 empty라고 하지 않고, () 안에 추가 정보가 있는 전화만들다!
  3. 이 정보의 핵심은 “일어난 일에 대해 필요할 수 있는 정보”전달되는 것이다 EventListen 함수의 첫 번째 인수는 항상 ‘방금 발생한 일에 대한 정보’입니다.

따라서 파라미터 부분에 정보를 읽을 수 있는 공간을 마련해 놓으면 읽을 수 있습니다. 어떤 종류의 정보가 전달되는지 확인하기 위해 다음 코드를 작성해 보겠습니다. onLoginSubmit()의 첫 번째 매개변수 이름은 아무 단어나 입력하여 확인할 수 있습니다.

function onLoginSubmit(olivia) {
    // 새로고침을 막는다.
    olivia.preventDefault();
    console.log(olivia);
}

loginForm.addEventListener('submit', onLoginSubmit);


위 코드의 출력

요청된 업데이트를 차단하는 코드도 인수로 받아 콘솔에 기록되었습니다. 기본금지됨preventDefault의 역할로 확인할 수 있는 것은 각 이벤트의 기본 동작입니다.(기능에 대해 브라우저가 기본적으로 수행하는 작업)이것은 방지되어야 합니다. 따라서 폼을 제출할 때 기본 동작은 새로 고침이므로 적절한 코드를 작성하여 새로 고침을 차단할 수 있습니다.


사용자 이름 얻기

이제 사용자가 이름을 입력하면 폼(입력, 버튼)을 직접 제거(=== HTML 요소를 제거하여 화면에 보이지 않게)하는 구현을 합니다.

// HTML
<body>
  <form id="login-form">
    <input type="text" maxlength="15" placeholder="Whai is your name?" required />
    <button>Log In</button>
  </form>
  <h1 class="hidden" id="greeting"></h1>

  <script src="http://oliviakim.m/app.js"></script>
</body>
// CSS
.hidden {
  display: none;
}
const loginForm = document.querySelector('#login-form');
const loginInput = document.querySelector('#login-form input');
const greeting = document.querySelector('#greeting');

// 'hidden'을 두 번 사용하고 있으니 아예 변수로 선언해서 오류 발생의 위험을 줄인다.
// string만 포함된 변수는 대문자로 표기하고 string을 저장하고 싶을 때 사용한다.
const HIDDEN_CLASSNAME = 'hidden';

function onLoginSubmit(event) {
  event.preventDefault();

  // 1. username을 입력했을 때, className 'hidden'을 부여해 화면에서 보이지 않게 한다.
  const username = loginInput.value;
  loginForm.classList.add(HIDDEN_CLASSNAME);

  // 2. 화면에 숨겨뒀다가 username이 입력되면 화면에 보여주는 HTML 요소를 추가한다.
  greeting.innerText = `Hello, ${username}!`;
  greeting.classList.remove(HIDDEN_CLASSNAME);
}

loginForm.addEventListener('submit', onLoginSubmit);


사용자 이름 설정

매번 입력할 필요가 없도록 사용자가 입력한 사용자 이름을 저장해 두겠습니다. 저장소는 로컬 저장소를 사용합니다.

로컬 저장소를 사용하면 브라우저에 항목을 저장할 수 있습니다. 그래서 나중에 사용할 수 있습니다. 저장된 내용은 Application > Local Storage에서 개발자 도구를 연 후 확인할 수 있습니다.

로컬 저장소에 항목 저장

localStorage.setItem(‘키’, ‘값’);



로컬 저장소에 저장된 데이터 가져오기

localStorage.getItem(‘키’, ‘값’);


로컬 저장소에 저장된 데이터 삭제

localStorage.setItem(‘키’, ‘값’);



위의 코드를 사용하여 몇 가지 코드를 작성해 보겠습니다.

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

// 'hidden'을 두 번 사용하고 있으니 아예 변수로 선언해서 오류 발생의 위험을 줄인다.
// string만 포함된 변수는 대문자로 표기하고 string을 저장하고 싶을 때 사용한다.
const HIDDEN_CLASSNAME = 'hidden';

function onLoginSubmit(event) {
  event.preventDefault();
  const username = loginInput.value;
  // localStorage에 사용자가 입력한 username 저장해두기
  localStorage.setItem('username', username);
  loginForm.classList.add(HIDDEN_CLASSNAME);
  greeting.innerText = `Hello, ${username}!`;
  greeting.classList.remove(HIDDEN_CLASSNAME);
}

loginForm.addEventListener('submit', onLoginSubmit);


사용자 이름 로드 중

사용자 이름이 로컬 저장소에 존재하는지 확인하고 존재하는 경우 양식을 화면에 보이지 않게 하고 h1을 표시합니다.

// HTML
<body>
  <form class="hidden" id="login-form">
    <input type="text" maxlength="15" placeholder="Whai is your name?" required />
    <button>Log In</button>
  </form>
  <h1 class="hidden" id="greeting"></h1>

  <script src="http://oliviakim.m/app.js"></script>
</body>
// JavaScript

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

// 본인이 생성한 string을 반복하게 사용하게 될 경우에는
// 반복되는 string들을 대문자 변수에 저장해놓는 것이 좋다.
// 추후 오타가 났다면 js가 감지해서 오류 알림을 띄워주기 때문이다.
const HIDDEN_CLASSNAME = 'hidden';
const USERNAME_KEY = 'username';

function onLoginSubmit(event) {
  event.preventDefault();
  const username = loginInput.value;
  // localStorage에 사용자가 입력한 username 저장해두기
  localStorage.setItem(USERNAME_KEY, username);
  loginForm.classList.add(HIDDEN_CLASSNAME);
  paintGreetings(username);
}

// h1을 보여주기
function paintGreetings(username) {
  greeting.innerText = `Hello, ${username}!`;
  greeting.classList.remove(HIDDEN_CLASSNAME);
}


// localStorage에 username값이 있는지 확인하기
const savedUsername = localStorage.getItem(USERNAME_KEY);
if(savedUsername === null) {
  // form을 보여주기
  loginForm.classList.remove(HIDDEN_CLASSNAME);
  loginForm.addEventListener('submit', onLoginSubmit);
} else {
  paintGreetings(savedUsername);
}


(참고 자료)

https://nomadcoders.co/javascript-for-beginners

Vanilla JS로 Chrome 앱 빌드 – Nomad Coders

초보자를 위한 자바스크립트

nomadcoders.co