본문 바로가기
Today I Learned

firebase를 이용한 방명록 기능 구현하기 - javascript [1단계]

by rinny01 2024. 12. 27.
반응형
1단계 : HTML / Javascript 로 구현하기
  • 구현 : 입력을 완료한 후 제출하면 입력한 값이 노출된다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>방명록</title>
    
</head>
<body>
    <form name="send-msg" id="sendMsg">
        <div class="inputForm">
            <label for="userId">작성자</label>
            <input type="text" name="name" id="userId" placeholder="이름">
        </div>
        <div class="inputForm">
            <label for="msg">내용</label>
            <input type="textarea" name="message" id="msg" placeholder="내용을 입력하세요">
        </div>
        <div class="inputForm">
            <label for="userPw">비밀번호</label>
            <input type="password" name="password" id="userPw" placeholder="비밀번호 입력">
        </div>
        <button type="submit">방명록 남기기</button>
    </form>
    <ul id="message">
        
    </ul>
    <script>
        document.getElementById("sendMsg").addEventListener("submit",function(e){
            e.preventDefault();
            var name = document.getElementById("userId").value;
            var message = document.getElementById("msg").value;
            var password = document.getElementById("userPw").value;

            if(name === "" || message === "" || password === ""){
                if(!name){
                    alert("작성자를 입력하세요");
                }
                if(!message){
                    alert("내용을 입력하세요");
                }
                if(!password){
                    alert("비밀번호를 입력하세요");
                }
            }
            const newLi = document.createElement("li");
            newLi.innerHTML=`
                <p class="name">${name}</p>
                <p class="message">${message}</p>
            `; 
            document.getElementById("message").prepend(newLi);
            //폼 비우기
            e.target.name.value = "";
            e.target.message.value = "";
            e.target.password.value = "";

        })
    </script>
</body>
</html>
  • 기능
  • submit 이벤트리스너 등록 
    • 사용자가 폼을 제출할때마다 실행된다.
    • e.preventDefault(); : 폼을 제출할때 기본적으로 새로고침 되는데, 이 기본 동작을 방지한다. 이를 막지 않으면 제출할때마다 새로고침되는 현상이 나옴.
<form name="send-msg" id="sendMsg">
      //input 요소 생략
        <button type="submit">방명록 남기기</button>
</form>
<script>
document.getElementById("sendMsg").addEventListener("submit",function(e){
	//실행코드 작성
})
</script>

 

  • if문 유효성 검사
  • 유효성 검사 후 실제 입력 값이 추가되도록
    •     <ul id="message">
              여기에 li 태그들이 추가되도록 할거다.
          </ul>
    • 우선은 새로운li 요소를 동적으로 추가한다  : createElement ("li");
    • 앞의 input들의 value값을 변수로 저장해두었는데, ${변수명} 으로 각 저장해둔 닶을 나타나게 해준다.
const newLi = document.createElement("li");
newLi.innerHTML=`
    <p class="name">${name}</p>
    <p class="message">${message}</p>`;
document.getElementById("message").prepend(newLi)

 

 

끝난줄 알았겟지만 여기서 문제점은 폼을 제출하였는데 인풋에 값이 계속 남아있는것이다.

  • 폼 비워주기
name.value = "";
message.value = "";
password.value = "";
  • 왜 안없어질까? 
    • 위에 선언했던 name, message, password 의 변수는 이미 HTML 요소의 값을 가져온 그냥 문자열이기 때문이다.
    • 그럼 어떻게 삭제시키냐?
    • document.getElementById("userId").value = ""; 이런식으로 HTML 요소를 참조하여 접근해야한다.
    • e.target.name.value=""; 로 이벤트가 발생한 타겟을 가르켜 폼 요소로 접근한다.
    • 쨋든 중요한건 인풋 요소에 정확하게 접근하여야 한다.

이까지 하면 파이어 베이스를 사용하기 전까지 구현은 완성되었다 !

 

하지만 여기서 또 문제점은...

새로고침하면 기록했던 방명록들이 다 사라진다 ㅠㅠ

2단계는 파이어 베이스를 이용하여 새로고침 하여도 이전에 기록하였던 방명록이 남아있도록 구현하겠다!!

 

아무튼 여기까지는 작은 실수만 신경쓰면 구현이 쉬운편이다 !

실수 요인

  1. e.preventDefault(); : 기본 제출동작 막기
  2. input요소에 정확하게 접근하기.

 

반응형
LIST