JavaScript

JavaScript 회원가입(정규식, 서명, 별명, CKEditor5(자기소개))

code2772 2022. 11. 28. 12:52
728x90
반응형

✔ 전체 화면 

✔ HTML 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원가입</title>
    <script defer src="./js/script.js"></script>
    <link rel="stylesheet" href="./css/style.css">

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>



<!-- 버튼작업인 submit 발생 경우 js 파일에서 sendit()함수를 실행하여 조건을 확인하는 부분 -->
<!-- 버튼 같은거는 서브밋 -->
</head>
<body>
<h2 style="display:inline ;">* 회원가입</h2><h4 style="display:inline ;color: red;"> - 아래 필수 입력사항을 모두 입력해 주십시요.</h4>
<hr style="background-color: orange; height: 2px; border: 0;">
<form action="./regist.jsp" name="regform" id="regform" method="post" onsubmit="return sendit()">

<p>아이디 <input type="text" name = "userid" id = "userid" maxlength="20"> 최소 3자이상 입력하세요.</span></p>
<div style="margin-left: 150px;">* 영문자, 숫자,_만 입력 가능, 최소 3자이상 입력하세요</div>
<hr>
<p>패스워드 <input type="password" name = "userpw" id = "userpw" maxlength="20"> </p>
<hr>
<p>패스워드 확인 <input type="password" name = "userpw_re" id = "userpw_re" maxlength="20"> </p>
<hr>
<p>이름 <input type="text" name="name" id="name"> *공백없이 한글만 입력 가능</p>
<hr>
<p>별명 <input type="text" name="char" id="char"></p>
<div style="margin-left: 150px;">*공백없이 한글, 영문, 숫자만 입력가능 (한글2자, 영문자 4자 이상) <br>
*별명을 바꾸시면 앞으로 60일 이내에는 변경할 수 없습니다.</div>
<hr>
<p>이메일 : <input type="text" name="email" id="email"></p>
<hr>
<p>생년월일 <input type="date" name="date" id="date"></p>
<hr>
<p>성별 <select name="gender" id="gender">
<option value="">선택하세요</option>
<option value="남자">남자</option>
<option value="여자">여자</option>
</select></p>
<hr>
<p>전화번호 <input type="text" name="hp" id="hp"></p>
<hr>
<p>핸드폰번호 <input type="text" name="hp1" id="hp1"></p>
<hr>
<p>주소 <input type="text" name="zipcode" maxlength="5" id="sample6_postcode"style="width: 100px;" >-<input type="text" name="address1" id="sample6_address" style="width: 100px;"><button onclick="sample6_execDaumPostcode()" type="button" >우편번호검색</button></p>
<p> <input type="text" name="address3" id="sample6_extraAddress" style="width: 400px;"></p>
<p> <input type="text" name="address2" id="sample6_detailAddress" style="width: 400px;"></p>
<hr>
<p>서명
 <canvas id="drawCanvas" width="500" height="100" style=" position: relative; border: 1px solid #000;"></canvas>
</p>
<hr>
<p> 자기소개<div id="editor"></div>
<script >
ClassicEditor
.create( document.querySelector( '#editor' ) )
.catch( error => {
console.error( error );
} );
</script>
</p>

<hr>
<p>메일링서비스 <input type="checkbox" id="hobby1" value="등산">정보 메일을 받습니다<p>
<hr>
<p>SMS 수신여부 <input type="checkbox" id="hobby2" value="등산">핸드폰 문자메세지를 받겠습니다.<p>
<hr>
<p>정보공개 <input type="checkbox" id="hobby3" value="등산">다른 분들이 나의 정보를 볼 수 있도록 합니다.<br>
<div style="margin-left: 150px;">정보공개를 바꾸시면 앞으로 0일 이내에는 변경이 안됩니다.</div><p>
<hr>
<p>추천인아이디 <input type="text" name = "rid" id = "rid" maxlength="20"> </p>
<hr>
<p>자동등록방지 <img src="캡처.PNG" style="height:50px ;"> <input type="text" name = "rid1" id = "rid1" maxlength="20"> *왼 쪽의 글자를 입력 </p>
<hr>
<!-- <p>주소 <input type="text" name="sample6_address"></p>

<p>상세주소 <input type="text" name="sample6_detailAddress"></p>
<p>참고사항 <input type="text" name="sample6_extraAddress"></p> -->
<p id="b"><button style="color: orangered ;text-align: center; width:200px;height:50px;font-size: 20px; background-color: orangered; color: white; border-radius: 5%;">확인</button></p>
</form>
</body>
</html>

 

✔ CSS

function sendit(){

    const userid = document.getElementById('userid');
    const userpw = document.getElementById('userpw');
    const userpw_re = document.getElementById('userpw_re')
    const name = document.getElementById('name');
    const hp = document.getElementById('hp');
    const hp1 = document.getElementById('hp1');
    const email = document.getElementById('email');
    const gender = document.getElementsByName('gender');
    const char = document.getElementById('char');

    // 정규 표현식
    const expIdText = /^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9]{3,16}$/; 
    // 3~16 자리이며 대문자 소문자 한자 이상 각각 들어가야 하며 숫자까지만 사용가능
    const expPwText = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/;
    const expNameText = /^[가-힣]+$/;
    const expHpText = /^\d{3}\d{3,4}\d{4}$/;// - 제거
    const expHp1Text = /^\d{3}\d{3,4}\d{4}$/;// - 제거
    const expEmailText = /^[A-Za-z0-9\-\.]+@[A-Za-z0-9\-\.]+\.[A-Za-z0-9]+$/;
    const expChartext = /^[가-힣]{2,}[a-zA-Z]{4,}\d{0,}$/;

  

  
    if(userid.value == ''){
        alert('아이디를 입력하세요');
        userid.focus();
        return false;
    }
    if(!expIdText.test(userid.value)){
        alert('아이디는 3자 이상 16자 이하이며 대문자 소문자는 각각 1개 이상 \n들어가야 하며 숫자까지 사용 가능합니다.');
        userid.focus();
        return false;
    }

    if(userpw.value==''){
        alert('비밀번호를 입력하세요');
        userpw.focus();
        return false;
    }

    if(!expPwText.test(userpw.value)){
        alert('비밀번호 형식을 확인하세요\n소문자,대문자,숫자,특수문자 1개씩 꼭 입력해야합니다');
        userpw.focus();
        return false;
    }

    if(userpw.value != userpw_re.value){
        alert('비밀번호와 비밀번호 확인의 값이 다릅니다');
        userpw_re.focus;
        return false;
    }

    if(!expNameText.test(name.value)){
        alert('이름은 한글로 입력하세요');
        name.focus();
        return false;
    }

    if(!expChartext.test(char.value)){
        alert('별명 확인하세요 한글, 영어 순으로 2자 / 4자');
        char.focus();
        return false;
    }

    if(!expEmailText.test(email.value)){
        alert('이메일 형식을 확인하세요');
        email.focus();
        return false;
    }

    if(regform.gender.value == ""){
        alert('성별을 선택하세요');
        regform.gender.focus();
        return false;
    }


    if(!expHpText.test(hp.value)){
        alert('휴대폰번호 형식을 확인하세요\n하이픈(-)을 제거해야 합니다.');
        hp.focus();
        return false;
    }

    if(!expHpText.test(hp1.value)){
        alert('휴대폰번호 형식을 확인하세요\n하이픈(-)을 제거해야 합니다.');
        hp1.focus();
        return false;
    }

 


   
 


    return true;
    
}


if (window.addEventListener) {
    window.addEventListener('load', InitEvent, false);
}
var canvas, context, tool;
function InitEvent() {
    canvas = document.getElementById('drawCanvas');
    if (!canvas) {
   alert("캔버스 객체를 찾을 수 없음");
   return;
    }
    if (!canvas.getContext) {
   alert("Drawing Contextf를 찾을 수 없음");
   return;
    }
    context = canvas.getContext('2d');
    if (!context) {
   alert("getContext() 함수를 호출 할 수 없음");
   return;
    }
    // Pencil tool 객체를 생성 한다.
    tool = new tool_pencil();
    canvas.addEventListener('mousedown', ev_canvas, false);
    canvas.addEventListener('mousemove', ev_canvas, false);
    canvas.addEventListener('mouseup', ev_canvas, false);
    canvas.addEventListener('touchstart', ev_canvas, false);
    canvas.addEventListener('touchmove', ev_canvas, false);
    canvas.addEventListener('touchend', ev_canvas, false);
}
function tool_pencil() {
    var tool = this;
    this.started = false;

    // 마우스를 누르는 순간 그리기 작업을 시작 한다. 
    this.mousedown = function (ev) {
   context.beginPath();
   context.moveTo(ev._x, ev._y);
   tool.started = true;
    };
    // 마우스가 이동하는 동안 계속 호출하여 Canvas에 Line을 그려 나간다
    this.mousemove = function (ev) {
   if (tool.started) {
       context.lineTo(ev._x, ev._y);
       context.stroke();
   }
    };
    // 마우스 떼면 그리기 작업을 중단한다
    this.mouseup = function (ev) {
   if (tool.started) {
       tool.mousemove(ev);
       tool.started = false;
   }
    };

    // 마우스를 누르는 순간 그리기 작업을 시작 한다. 
    this.touchstart = function (ev) {
   context.beginPath();
   context.moveTo(ev._x, ev._y);
   tool.started = true;
    };
    // 마우스가 이동하는 동안 계속 호출하여 Canvas에 Line을 그려 나간다
    this.touchmove = function (ev) {
   if (tool.started) {
       context.lineTo(ev._x, ev._y);
       context.stroke();
   }
    };
    // 마우스 떼면 그리기 작업을 중단한다
    this.touchend = function (ev) {
   if (tool.started) {
       tool.touchmove(ev);
       tool.started = false;
   }
    };
}
// Canvas요소 내의 좌표를 결정 한다.
function ev_canvas(ev) {
    if (ev.layerX || ev.layerX == 0) { // Firefox 브라우저
   ev._x = ev.layerX;
   ev._y = ev.layerY;
    }
    else if (ev.offsetX || ev.offsetX == 0) { // Opera 브라우저
   ev._x = ev.offsetX;
   ev._y = ev.offsetY;
    }
    else if (ev.targetTouches[0] || ev.targetTouches[0].pageX == 0) {  //핸드폰
   var left = 0;
   var top = 0;
   var elem = document.getElementById('drawCanvas');

   while (elem) {
       left = left + parseInt(elem.offsetLeft);
       top = top + parseInt(elem.offsetTop);
       elem = elem.offsetParent;
   }

   ev._x = ev.targetTouches[0].pageX - left;
   ev._y = ev.targetTouches[0].pageY - top;
    }
    // tool의 이벤트 핸들러를 호출한다.
    var func = tool[ev.type];
    if (func) {
   func(ev);
    }
}

function onClear() {
    canvas = document.getElementById('drawCanvas');
    context.save();
   context.setTransform(1, 0, 0, 1, 0, 0);
   context.clearRect(0, 0, canvas.width, canvas.height);
   context.restore();
}





function sample6_execDaumPostcode() {
    new daum.Postcode({
        oncomplete: function(data) {
            // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

            // 각 주소의 노출 규칙에 따라 주소를 조합한다.
            // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
            var addr = ''; // 주소 변수
            var extraAddr = ''; // 참고항목 변수

            //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
            if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
            } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
            }

            // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
            if(data.userSelectedType === 'R'){
                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                    extraAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment === 'Y'){
                    extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                if(extraAddr !== ''){
                    extraAddr = ' (' + extraAddr + ')';
                }
                // 조합된 참고항목을 해당 필드에 넣는다.
                document.getElementById("sample6_extraAddress").value = extraAddr;
                
            } else {
                document.getElementById("sample6_extraAddress").value = '';
            }

            // 우편번호와 주소 정보를 해당 필드에 넣는다.
            document.getElementById('sample6_postcode').value = data.zonecode;
            document.getElementById("sample6_address").value = addr;
            // 커서를 상세주소 필드로 이동한다.
            document.getElementById("sample6_detailAddress").focus();
        }
    }).open();
}





 

✔ JS


 
input[type=date]::-webkit-datetime-edit-text {
  -webkit-appearance: none;
  display: none;
}
input[type=date]::-webkit-datetime-edit-month-field{
  -webkit-appearance: none;
  display: none;
}
input[type=date]::-webkit-datetime-edit-day-field {
  -webkit-appearance: none;
  display: none;
}
input[type=date]::-webkit-datetime-edit-year-field {
  -webkit-appearance: none;
  display: none;
}

input{text-align: center;}


div{
  margin: 0, auto;
  color: grey;
  font-size: 12px;
}

#canvas {
  width: 300px;
  height: 50px;
  border: 1px solid black;
}

 #userid{margin-left: 100px;}
 #userpw{margin-left: 85px;}
 #userpw_re{margin-left: 48px;} 
 #name{margin-left: 115px;} 
 #char{margin-left: 115px;} 
 #email{margin-left: 90px;} 
 #date{margin-left: 80px;} 
 #gender{margin-left: 110px;} 
 #hp{margin-left: 80px;} 
 #hp1{margin-left: 65px;} 
 #sample6_postcode{margin-left: 110px;} 
 /* #sample6_address{margin-left: 70px;}  */
 #sample6_extraAddress{margin-left: 150px;} 
 #sample6_detailAddress{margin-left: 150px;} 
 #drawCanvas{margin-left: 110px;}
 
 #hobby1{margin-left: 55px;}
 #hobby2{margin-left: 48px;}
 #hobby3{margin-left: 85px;} 

 #rid{margin-left: 48px;}
 
img{margin-left: 45px;}
#b{
  margin-left: 0, auto;
  text-align: center;
}

#userpw{
  text-align: center;
  margin: 0, auto;
} 

body{
  width: 700px;
 margin: 0 auto;
}

 

✔ 회원가입 페이지 서명 부분

🔏 HTML 서명

<p>서명
            <canvas id="drawCanvas" width="500" height="100" style=" position: relative; border: 1px solid #000;"></canvas>
        </p>
 
🔏 JS 서명
 
if (window.addEventListener) {
    window.addEventListener('load', InitEvent, false);
}
var canvas, context, tool;
function InitEvent() {
    canvas = document.getElementById('drawCanvas');
    if (!canvas) {
    alert("캔버스 객체를 찾을 수 없음");
    return;
    }
    if (!canvas.getContext) {
    alert("Drawing Contextf를 찾을 수 없음");
    return;
    }
    context = canvas.getContext('2d');
    if (!context) {
    alert("getContext() 함수를 호출 할 수 없음");
    return;
    }
    // Pencil tool 객체를 생성 한다.
    tool = new tool_pencil();
    canvas.addEventListener('mousedown', ev_canvas, false);
    canvas.addEventListener('mousemove', ev_canvas, false);
    canvas.addEventListener('mouseup', ev_canvas, false);
    canvas.addEventListener('touchstart', ev_canvas, false);
    canvas.addEventListener('touchmove', ev_canvas, false);
    canvas.addEventListener('touchend', ev_canvas, false);
}
function tool_pencil() {
    var tool = this;
    this.started = false;

    // 마우스를 누르는 순간 그리기 작업을 시작 한다.
    this.mousedown = function (ev) {
    context.beginPath();
    context.moveTo(ev._x, ev._y);
    tool.started = true;
    };
    // 마우스가 이동하는 동안 계속 호출하여 Canvas에 Line을 그려 나간다
    this.mousemove = function (ev) {
    if (tool.started) {
        context.lineTo(ev._x, ev._y);
        context.stroke();
    }
    };
    // 마우스 떼면 그리기 작업을 중단한다
    this.mouseup = function (ev) {
    if (tool.started) {
        tool.mousemove(ev);
        tool.started = false;
    }
    };

    // 마우스를 누르는 순간 그리기 작업을 시작 한다.
    this.touchstart = function (ev) {
    context.beginPath();
    context.moveTo(ev._x, ev._y);
    tool.started = true;
    };
    // 마우스가 이동하는 동안 계속 호출하여 Canvas에 Line을 그려 나간다
    this.touchmove = function (ev) {
    if (tool.started) {
        context.lineTo(ev._x, ev._y);
        context.stroke();
    }
    };
    // 마우스 떼면 그리기 작업을 중단한다
    this.touchend = function (ev) {
    if (tool.started) {
        tool.touchmove(ev);
        tool.started = false;
    }
    };
}
// Canvas요소 내의 좌표를 결정 한다.
function ev_canvas(ev) {
    if (ev.layerX || ev.layerX == 0) { // Firefox 브라우저
    ev._x = ev.layerX;
    ev._y = ev.layerY;
    }
    else if (ev.offsetX || ev.offsetX == 0) { // Opera 브라우저
    ev._x = ev.offsetX;
    ev._y = ev.offsetY;
    }
    else if (ev.targetTouches[0] || ev.targetTouches[0].pageX == 0) {   //핸드폰
    var left = 0;
    var top = 0;
    var elem = document.getElementById('drawCanvas');

    while (elem) {
        left = left + parseInt(elem.offsetLeft);
        top = top + parseInt(elem.offsetTop);
        elem = elem.offsetParent;
    }

    ev._x = ev.targetTouches[0].pageX - left;
    ev._y = ev.targetTouches[0].pageY - top;
    }
    // tool의 이벤트 핸들러를 호출한다.
    var func = tool[ev.type];
    if (func) {
    func(ev);
    }
}

function onClear() {
    canvas = document.getElementById('drawCanvas');
    context.save();
    context.setTransform(1, 0, 0, 1, 0, 0);
    context.clearRect(0, 0, canvas.width, canvas.height);
    context.restore();
}

✔ 자기소개 부분 CKEditor5

🔏 자기소개 HTML

<p> 자기소개<div id="editor"></div>
        <script >
            ClassicEditor
              .create( document.querySelector( '#editor' ) )
              .catch( error => {
                console.error( error );
              } );
          </script>
      </p>
 
 
 
🔏 별명 공백없이 한글, 영문, 숫자만 입력 한글 최소 2자리, 영어 2자리
 
if(!expChartext.test(char.value)){
        alert('별명 확인하세요 한글, 영어 순으로 2자 / 4자');
        char.focus();
        return false;
    }
 
 
 
🔏 성별 선택부분 HTML
 
<p>성별 <select name="gender" id="gender">
            <option value="">선택하세요</option>
            <option value="남자">남자</option>
            <option value="여자">여자</option>
        </select></p>
 
🔏 성별 선택부분 JS
 

    if(regform.gender.value == ""){
        alert('성별을 선택하세요');
        regform.gender.focus();
        return false;
    }
 
✔ 다른 아이디, 비밀번호, 이메일, 휴대폰 등 형식은 과거 자료 참고
 

 

반응형