Learn & Record

JavaScript (참가신청 최종, 주문 프로그램, 회원가입) 본문

Dev/HTML CSS JS

JavaScript (참가신청 최종, 주문 프로그램, 회원가입)

Walker_ 2024. 4. 5. 14:02

1. 참가신청 최종

 - 화살표 함수와 일반 함수는 this가 다름

 - this를 사용하려면 이벤트 리스너의 콜백 함수에서 화살표 함수를 사용하지 않거나

 - this대신 event.currentTarget을 사용

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./css/name_list.css">
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const btn = document.querySelector('button')
            const userName = document.querySelector('#username')
            const nameList = document.querySelector('#nameList')

            btn.addEventListener('click', function (event){
                // 기본 이벤트 (submit) 막기
                event.preventDefault(); // submit 방지

                // 1. 새로운 요소를 만들고, input 태그에 있는 문자열을 추가
                // createElement() : 새로운 요소를 만듬
                const item = document.createElement('p'); // 새 p 요소 만들기
                item.textContent = userName.value;
                const del = document.createElement('span')
                del.textContent = "X"
                del.setAttribute('class', 'del')

                // 2. nameList에 새로 만든 요소 추가하기
                // nameList.appendChild(item); // p 요소를 element
                item.appendChild(del)
                nameList.insertBefore(item, nameList.childNodes[0]); // p요소를 #nameList 맨 앞에 추가하기

                // 새로 생성된 요소에 이벤트를 추가할 경우에는 생성될 때 마다 이벤트를 등록해야 함
                del.addEventListener('click', function(event) {
                    if (confirm('삭제하시겠습니까?')) {
                        event.currentTarget.parentNode.parentNode.removeChild(event.currentTarget.parentNode);
                    }
                })
                // 3. input태그에 문자열 제거하기
                userName.value = ''; // 텍스트 필드 지우기
            })
        })
    </script>
</head>
<body>
<div id="container">
    <h1>참가 신청</h1>
    <form action="">
        <input type="text" id="username" placeholder="이름" required>
        <button id="upLoad">신청</button>
    </form>
    <hr>
    <div id="nameList"></div>
</div>
</body>
</html>

 

2. 주문 프로그램

 

 - 1) id값 또는 class 값을 요소에 접근 방법

 - id 값이나 class 값을 사용해 폼 요소에 접근하는 방법은 DOM의 다른 요소에 접근하는 것과 같음

 - querySelector() 함수나 querySelectorAll() 함수를 사용해서 특정 id값이나 class 값을 가진 요소에 접근 할 수 있음

 - 텍스트 필드에 있는 값을 가져오기 위해서는 텍스트 필드에 접근하는 소스 뒤에 value속성을 붙임

console.log(document.getElementById('billingName').value)
console.log(document.querySelector('[name=billingName]').value)

 

 - 2) name 값을 사용해 폼 요소에 접근하기

 - 폼 요소에 id나 class 속성이 없고 name 속성만 있다면 name 식별자를 사용해 폼 요소에 접근할 수도 있음

 - id나 calss 속성은 웹 개발에 css를 사용하기 시작하면서부터 등록했지만, 

 - name 속성은 자바스크립트에서 폼 요소를 구별하고 접근할 수 있도록 HTML 초기부터 사용하는 방법

 - 이 방법을 사용하려면 <form> 태그에 name 속성이 저장되어 있어야 하고,

 - <form> 태그 안에 포함된 폼 요소에도 name 속성이 있어야 함

 - name 속성을 사용해 폼 요소에 접근하려면 form의 name 값부터 폼 요소의 name값까지 계층을 따라 하나씩 지정

 - 폼 안에 있는 텍스트 필드에 접근하려면 <form>의 name 값과 텍스트 필드의 name 값을 사용

 

 - submit시에 input의 name은 서버로 전송. 하지만 form의 name은 서버로 전송되지 않음

console.log(document.order.billingName.value)

 

 - 3) 폼 배열을 사용해 폼 요소에 접근하기 

 - document의 속성 중 forms 속성은 문서 안에 있는 <form> 태그를 모두 가져와 배열 형태로 반환

 - 이 방법은 폼 요소에 id나 class 속성도 없고 name 속성도 없을 때 유용

 - <form> 태그 안에 포함된 요소에 접근하려면 elements 속성을 사용

 - 해당 폼 안에 있는 모든 폼 요소를 가져오는 속성

 - 인덱스 번호로 접근

console.log(document.forms[0].elements[1].value)

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./css/order.css">
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            const check = document.querySelector('#shippingInfo') // 체크박스 id는 shippingInfo
            let status = false;

            check.addEventListener('change', function(event) { // check 요소에 clcik 이벤트가 발생했을 때 함수
                // status = event.currentTarget.checked;
                // if (status) {
                //     document.querySelector('#shippingName').value = document.querySelector('#billingName').value;
                //     document.querySelector('#shippingTel').value = document.querySelector('#billingTel').value;
                //     document.querySelector('#shippingAddr').value = document.querySelector('#billingAddr').value;
                // }
                if (check === true) { // 체크 되었다면
                    document.querySelector('#shippingName').value = document.querySelector('#billingName').value;
                    document.querySelector('#shippingTel').value = document.querySelector('#billingTel').value;
                    document.querySelector('#shippingAddr').value = document.querySelector('#billingAddr').value;
                }
                else { // 체크되어 있지 않다면 배송 정보 필드를 지움
                    document.querySelector('#shippingName').value = ''
                    document.querySelector('#shippingTel').value = ''
                    document.querySelector('#shippingAddr').value = ''
                }
            })
        });
    </script>
</head>
<body>
<!-- 배송 정보 자동으로 입력하기 1 -->
<div id="container">
    <form name="order">
    <fieldset>
        <legend> 주문 정보</legend>
        <ul>
            <li>
                <label class="field" for="billingName">이름 : </label>
                <input type="text" class="input-box" id="billingName" name="billingName">
            </li>
            <li>
                <label class="field" for="billingTel">연락처 : </label>
                <input type="text" class="input-box" id="billingTel" name="billingTel">
            </li>
            <li>
                <label class="field" for="billingAddr">주소 : </label>
                <input type="text" class="input-box" id="billingAddr" name="billingAddr">
            </li>
        </ul>
    </fieldset>
    </form>
    <form name="ship">
    <fieldset>
        <legend> 배송 정보</legend>
        <ul>
            <li>
                <input type="checkbox" id="shippingInfo" name="shippingInfo">
                <label class="check">주문 정보와 배송 정보가 같습니다</label>
            </li>
            <li>
                <label class="field" for="shippingName">이름 : </label>
                <input type="text" class="input-box" id="shippingName" name="shippingName">
            </li>
            <li>
                <label class="field" for="shippingTel">연락처 : </label>
                <input type="text" class="input-box" id="shippingTel" name="shippingTel">
            </li>
            <li>
                <label class="field" for="shippingAddr">주소 : </label>
                <input type="text" class="input-box" id="shippingAddr" name="shippingAddr">
            </li>
        </ul>
    </fieldset>
    </form>
    <button type="submit" class="order">결제하기</button>

</div>
</body>
</html>

 

 

3. 회원가입 프로그램

 - 1) 회원 가입 페이지 입력 값 검증하기

 - [가입하기] 버튼을 클릭하면 아이디 글자 수 확인하기

 

 - 2) 비밀번호 확인하기

 - 비밀번호 필드에 입력한 내용의 글자 수가 8자리 이상인지 확인

 - 비밀번호 확인 필드에 입력한 값이 비밀번호의 필드 값과 같은지 확인

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./css/register.css">
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            const btnSubmit = document.querySelector('.btn.btnBlack'); // 가입하기 버튼
            const userId = document.getElementById('user-id'); // 아이디 필드
            const frmRegister = document.getElementById('register') // 폼태그

            const pw1 = document.querySelector('#user-pw1') // 비밀번호 필드
            const pw2 = document.querySelector('#user-pw2') // 비밀번호 필드

            btnSubmit.addEventListener('click', function () {
                const idLength = document.querySelector('#user-id').value.length
                console.log(idLength)
                if (idLength < 4 || idLength > 15) {
                    // userId 필드 내용의 길이가 4미만이거나 15 보다 더 큰 경우 실행
                    alert('4~15자리로 입력하세요.'); // 오류 메시지 출력
                    /*
                    select() : 사용자가 기존에 입력한 값을 선택
                    focus() : 사용자가 기존에 입력한 값을 지우고 새로운 값을 입력하도록 텍스트 필드에 커서를 가져다 놓음
                     */
                    userId.select()
                    return;
                }
                frmRegister.submit();
            })

            pw1.addEventListener('change', function () {
                if (pw1.value.length < 8) {
                    alert('비밀번호는 8자리 이상이어야 합니다.')
                    pw1.value=''; // 비밀번호 필드 지움
                    pw1.focus(); // 비밀번호를 다시 입력할 수 있도록 포커싱
                }
            })

            // pw2 요소에 change 이벤트가 발생했을 때 실행
            pw2.addEventListener('change', function () {
                if (pw1.value != pw2.value) { // pw1과 pw2가 값이 틀리면 실행
                    alert('비밀번호가 다릅니다.')
                    pw1.focus(); // 비밀번호를 다시 입력할 수 있도록 포커싱
                }
            });

            //
            const btnTrans = document.querySelector('span.trans');
            btnTrans.addEventListener('click', function (e) {
                if (pw1.getAttribute('type') == 'password') {
                    pw1.setAttribute('type', 'text')
                    e.currentTarget.textContent = '패스워드로 변환';
                }
                else {
                    pw1.setAttribute('type', 'password')
                    e.currentTarget.textContent = '문자로 변환';
                }
            })
        })
    </script>
</head>
<body>
<div id="container">
    <h1>회원 가입</h1>
    <form action="#" id="register">
        <ul id="user-info">
            <li>
                <label for="user-id" class="field">아이디</label>
                <input type="text" name="user-id" id="user-id" placeholder="4~15자리로 입력" required>
            </li>
            <li>
                <label for="email" class="field">이메일</label>
                <input type="email" name="email" id="email" required>
            </li>
            <li>
                <label for="user-pw1" class="field">비밀번호</label>
                <input type="password" name="user-pw1" id="user-pw1" placeholder="8자리 이상" required>
                <span class="trans">문자로 변환</span>
            </li>
            <li>
                <label for="user-pw2" class="field">비밀번호 확인</label>
                <input type="password" name="user-pw2" id="user-pw2" required>
            </li>
            <li>
                <label class="field">메일링 수신</label>
                <label class="r"><input type="radio" value="yes" name="mailing">예</label>
                <label class="r"><input type="radio" value="no" name="mailing">아니오</label>
            </li>
        </ul>
        <ul id="buttons">
            <li>
                <input type="button" class="btn btnBlack" value="가입하기">
            </li>
            <li>
                <input type="reset" class="btn btnGray" value="취소">
            </li>
        </ul>
    </form>
</div>
</body>
</html>

 

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)