728x90
반응형

 

input에 이름을 쓰고 엔터를 치면 input 입력칸은 사라지고 이름만 출력되는 시스템

이름은 로컬스토리지에도 저장되므로 새로고침해도 이름이 저장되어있음

 

 

이름을 지우고 싶으면 F12에 Application에 LocalStorage에 들어가서 key값 오른쪽 마우스 클릭

 

 

 

 

1) HTML - 화면구성

<body>
    <form action="" class="js-form form">
        <!-- 이름을 쓸 빈칸 -->
        <input type="text" placeholder="what is your name?"/>
    </form>

    <!-- 이름이 출력되는 곳 -->
    <h4 class="js-greeting greeting"></h4>


    <script src="index.js"></script>
</body>

 

 

2) CSS - 이름이 있는 경우에는 이름을 쓰는 빈칸 input이 사라지도록 설정

.form,
.greeting {
  /* form과 h4를 숨겨놓은 상태 */
  display: none;
}

/* .showing을 클래스에 추가하면 숨겨놓은 것들이 보임 */
.showing {
  display: block;
}

 

 

 

3) JavaScript - HTML과 연결

const form = document.querySelector(".js-form");
const input = form.querySelector("input");
const greetint = document.querySelector(".js-greeting");

 

 

4) JavaScript - 로직

① loadName( )

- Local Storage의 value값인 currentUser가 null인지 아닌지 if문 조건에 따라 askForName( ) paintGreeting( ) 함수 실행

// 따옴표 안에 있는 값은 실제 로컬스토리지에서 보여지는 key값을 의미
const USER_LS = "로컬스토리지의 Key값, 사용자 이름";

// ② init()함수 안에 있는 loadName(); 실행
function loadName(){
	// localStorage.getItem(USER_LS)가 localStorage의 value값
    // USER_LS가 localStorage의 key값
    // 이해 안되면 localStorage.getItem과 localStorage.setItem 공부 
    const currentUser = localStorage.getItem(USER_LS);
   
   //여기서 currentUser는 loadName()함수 안에 있는 전역변수 currentUser임 
   if(currentUser === null){
        askForName();
    }else{
        paintGreeting(currentUser);
    }
}

// ① 처음 실행되는 것
function init(){
    loadName();
}

init();

 

 

② askForName( )

- loadName( ) if문 조건이 currentUser === null 인 경우

- form 태그안에 있는 input을 보이게 하고 글을 쓰고 엔터를 눌렀을때 handleSubmit( )함수가 실행됨

//"showing"은 클래스의 이름이고 css에서 display:block;으로 설정되어있음
//클래스에 SHOWING_CN를 추가하면 display:none;인 상태를 block로 바꾸어 보이게 함
const SHOWING_CN="showing";

function askForName(){
    //form태그에 SHOWING_CN 클래스 이름을 추가함으로써 form태그 안에 있는 input이 보임
    form.classList.add(SHOWING_CN);

    //엔터를 누르면 handleSubmit()함수가 실행되도록 하는 이벤트리스너
    form.addEventListener("submit", handleSubmit);
}

 

 

handleSubmit( )

- form 태그 안에 있는 input에 이름을 쓰고 엔터를 눌렀을때 실행되는 함수

function handleSubmit(event) {
    /* event.preventDefault : form 태그 디폴트값에 의해 form태그 안에 있는 input에서 
    엔터를 누르면 자동으로 값이 어딘가로 보내져버리는 데 우리는 이 값을 다른 곳에 저장해 
    사용해야하기 때문에 디폴트 값인 이벤트를 멈추게 하는 메서드 
    */
    event.preventDefault;

    // input에 쓴 이름을 currentValue에 저장
    const currentValue = input.value;

    //저장한 이름을 saveName()와 paintGreeting()함수 인자로 보냄
    saveName(currentValue);
    paintGreeting(currentValue);
  
}

 

 

④ saveName( ) 

- handleSubmit( )함수 안 지역변수 currentValue를 인자로 받아 로컬스토리지 value값으로 저장하는 함수 

function saveName(text) {
    localStorage.setItem(USER_LS, text);
}

 

 

⑤ paintGreeting( )

- loadName( ) if문 조건이 currentUser === null 이 아닌 경우에는 바로 이 함수로 실행됨

 (여기서는 currentUser 즉 로컬스토리지의 value 값이 이미 저장되어 있으므로 그걸 사용해서 이름을 출력)

- handleSubmit( )함수에서 실행될때에는 input의 value값을 저장한 변수 currentValue를 인자로 받아옴

function paintGreeting(text) {
    //이름을 출력할꺼니까 이름 적는 input란은 숨기기
    form.classList.remove(SHOWING_CN);

    //이름을 출력할 h4는 보이기 함
    greeting.classList.add(SHOWING_CN);

    //인자로 받아온 currentValue 값을 text에 넣어서 출력함
    greeting.innerText=`Hello ${text}`;
}

 

 

 

5) 결과

 

input에 이름을 치고 엔터를 누르면↓↓↓

 

직접 실행해보세요😀

jina-choi.github.io/coding-with-jina/mini_project/printName/index.html

 

Document

 

jina-choi.github.io

 

 

 

 

 

 

728x90
반응형