javascript

12. Momentum 만들기 3 - 사용자 이름 저장하기1

으누아빠 2020. 6. 25. 17:28
반응형

1단계 사용자 이름 저장하기

  1. 사용자 입력폼 생성
  2. 사용자의 이름이 로컬 스토리지에 저장되어 있을경우 표시될 수 있도록 영역 추가
  3. 사용자의 이름이 로컬 스토리지에 저장되어 있을경우 표시

키워드1 HTML내의 javascript 파일의 위치 [async 와 defer]

  • 브라우저는 위에서 아래로 한줄씩 읽어 드림

    1. head태그 사이에 script를 추가할 경우

    <!DOCTYPE html>
    <html>
      <head>
          <meta charset="utf-8">
          <title>Something</title>
          <script src="javascript.js"></script>
      </head>
      <body>
      </body>
    </html>
    1. html parsing
    2. js 파일 다운로드
    3. js 파일 실행
    4. html parsing
      단점: JS 파일 이 크거나 인터넷 속도가 느릴경우 html 을 읽어 드리는 시간이 오래걸림

2. body태그 최하단에 script를 추가할 경우

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Something</title>
    </head>
    <body>
        <script src="javascript.js"></script>        
    </body>
</html>
  1. html parsing
  2. js 파일 다운로드
  3. js 파일 실행
    단점: html 이 javascript에 의존적경우 정상적으로 페이지가 열리지가 않는다.

3. head태그 사이에 async 속성이 있는 script 파일이 있을경우

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Something</title>
        <script async src="javascript.js"></script>
    </head>
    <body>
    </body>
</html>
  1. html parsing
  2. html parsing + js 파일 다운로드를 동시에 실행 (병렬)
  3. js 파일 다운로드 완료시 html parsing 일시중단 및 js 실행
  4. html parsing 진행
    단점: DOM 조작시 문제가 발생할수 있음

4. head태그 사이에 defer 속성이 있는 script 파일이 있을경우

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Something</title>
        <script defer src="javascript.js"></script>
    </head>
    <body>
    </body>
</html>
  1. html parsing + js 파일 다운로드를 동시에 실행 (병렬)
  2. html parsing을 계속 진행 (이 단계 언제가 js 파일 다운로드 완료)
  3. tml parsing이 완료된 후 js 실행

키워드2 localStorage

  • 사용자 로컬의 Storage Object 에 접근하게 해줌
  • 모든 key와 value는 항상 string으로 저장
  • localStorage에 저장되는 데이터는 만료시간이 없음
  • 로컬 스토리지 아이템 저장: localStorage.setItem('키', '값');
  • 로컬 스토리지 아이템 읽기: localStorage.getItem('키');
  • 로컬 스토리지 아이템 삭제: localStorage.remove('키');
  • 로컬 스토리지 아이템 전체삭제: localStorage.clear();

키워드3 Element.classList

  • element의 클래스 목록을 제어하는 속성임
  • IE 에서는 부분적으로 지원 (IE10 에서는 Not supported for SVG elements.)
  • .add( String [, String [, ...]] ): 지정한 클레스 추가
  • .remove( String [, String [, ...]] ): 지정한 클레스 삭제
  • .item( Number ): 해당 인덱스 값을 이용 클레스를 반환
  • .toggle( String [, force] ): argument 가 하나일 경우 클래스가 존재하면 삭제, 없으면 추가
  • 두번째 argument(true or false): 가 존재할경우 해당 값이 true 일경우 첫번째 argument값을 강제로 추가 false 일경우 강제로 삭제
  • .contains( String ): 지정한 문자열이 class 속성에 존재하는지 확인
  • .replace( oldClass, newClass ): 존재하는 클래스를 새로운 클래스로 교체

전체코드

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Something</title>
        <link rel="stylesheet" href="index.css" />
        <script defer src="clock.js"></script>
        <script defer src="greeting.js"></script>
    </head>
    <body>
        <div class="js-clock">
            <h1 class="js-title">00:00</h1>
        </div>
        <form class="js-form form">
            <input type="text" placeholder="What is your name?" />
        </form>
        <h4 class="js-greetings greetings"></h4>
    </body>
</html>

greeting.js

'use strict';

const USER = 'currentUser';
const SHOW = 'showing';
const form = document.querySelector('.js-form');
const input = form.querySelector('input');
const greeting = document.querySelector('.js-greetings');

function displayGreeting(user) {
    form.classList.remove(SHOW);
    greeting.classList.add(SHOW);
    greeting.innerHTML = `Hello ${user}`;
}

function init() {
    const currentUser = localStorage.getItem(USER);
    if (currentUser === null) {
        // 저장된 정보가 없을경우
    } else {
        displayGreeting(USER);
    }
}

init();

index.css

body {
    background-color: #ecf0f1;
}

.btn {
    cursor: pointer;
}

h1 {
    color: #34495e;
    transition: color 0.5s ease-in-out;
}

.clicked {
    color: #7f8c8d;
}

.form,
.greetings {
    display: none;
}

.showing {
    display: block;
}