국비지원학원/HTML,JavaScript,jQ

80일차-javaScript_회원가입 유효성 검증(더해야 함)

초코맛 2019. 2. 20. 00:05
반응형
*회원가입의 유효성 검증
  • 회원가입 창에는 필수입력사항이 존재하고
  • 1.중복확인을 눌렀을 때 아이디 중복확인popup 창이 뜨고 중복확인한 아이디를 부모창으로 전송한 후 자식창이 닫힌다.
  • 2.비밀번호 txtbox에서 커서가 빠져 나가면 비밀번호와 비밀번호 확인에 값이 같인지 비교한 후 같다면 커서를 "이름"에 이동시키고 같지 않다면 경고창에 "비밀번호를 확인해 주세요"를 보여주고 초기화 시킨 후 커서를 비밀번호에 이동시킨다.
  • 3.숫자 여섯개가 입력되면 커서를 주민번호 뒷자리로 이동시킨다.
  • 4.숫자 7개가 입력되고 커서가 빠져나가면 주민번호의 유효성 검증(유효성 검증이 유효하면 성별, 생년원일,나이를 계산하여 채워준다/유효하지 않다면 경고창을 보여주고 주민번호 입력값을 초기화한후 커서를 주민번호 첫자리에 위치시킨다.)
  • 5.우편번호 검색이 눌렸을때 popup창이 뜨고 이때 다음에서 제공하는 도로명주소를 사용해 동작하게 해준다. (주소나 우편번호가 클릭되면 부모창으로 전달하고 자식창을 닫고 커서를 상세주소로 이동시킨다.
  • 6.초기화 버튼이 눌리면 HTML Form Control의 값을 초기화 시킨다.
  • 7.가입 버튼이 눌리면 필수입력사항을 체크하고 해당 경고창을 보여준후 모두 입력되면 join.jsp에 값을 전달 한다.

 
*JavaScript에서 옵션 생성하기
  • 1. <select> 얻기
    • var sel=document.getElememtById("Id");
  • 2.select의 옵션 갯수 설정(초기화)
    • sel.length="남겨둘 옵션의 수"
  • 3.옵션 생성
    • sel.options[index]=new Option(보여줄값,넘겨줄값);
    • <option value="넘겨줄 값">보여줄 값</option>이 되게 됨
    • 동적으로 만들 수 있어 코드를 줄일 수 있다.
window.onload=function(){
           //옵션 생성
           //년
           //var b_year=document.getElementById("b_year");
           var obj=document.joinFrm;
           var b_year=obj.b_year;//1.select 얻기
           
           var date=new Date();
           var year_idx=0;
           //20살의 나이를 가진 년도에 selected
           var flag_year=date.getFullYear()-20+1;
           
           for(var i=1950; i<date.getFullYear()+1; i++){
                //2.select의 옵션 생성 Option(보여질값,  value값(넘겨줄값))
                b_year.options[year_idx]=new Option(i,i);
                if(flag_year==i){
                     b_year.selectedIndex=year_idx;
                }//end if;
                year_idx++;
           }//end for
           //b_year.options[50].selected = true;
          //b_year.options[50].setAttribute("selected","selected");
           
           //월 설정 1-12
           var b_month=obj.b_month;
           var month_idx=0;
           for(var i=1; i<13; i++){
                b_month.options[month_idx]=new Option(i,i);
                month_idx++;
           }//end for
           
           //일 설정 1-31
           var b_day=obj.b_day;
           var day_idx=0;
           for(var i=1; i<32; i++){
                b_day.options[day_idx]=new Option(i,i);
                day_idx++;
           }//end for
           
           //////////////////////////////////이벤트  등록/////////////////////////////////////////
          document.getElementById("idDup").addEventListener("click",popupCenter);
          document.getElementById("searchZip").addEventListener("click",popupCenter);
          document.getElementById("daumZip").addEventListener("click",execPostcode);
          document.getElementById("btnJoin").addEventListener("click",nullCheck);
           
          document.getElementById("pass2").addEventListener("blur",chkPass);
           
          document.getElementById("ssn1").addEventListener("keyup",moveSsn2);
          document.getElementById("ssn2").addEventListener("keyup",chkSsn);
           
     }//function-onload

<<<회원가입>>>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회 원 가 입</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
     #joinTitle{font-weight: bold; font-size: 20px;}
     .tdalign{text-align: center}
     table{margin: 0px auto}
     tr{height:25px}
     
     #wrap{width:1007px; margin: 0px auto;}
     #joinHeader{width:1007px; height:195px;
                     background: #FFFFFF url(images/header.png)  no-repeat;}
     .span{color:#FF0000;}
</style>
<script type="text/javascript">
     window.onload=function(){
           //옵션 생성
           //년
           //var b_year=document.getElementById("b_year");
           var obj=document.joinFrm;
           var b_year=obj.b_year;//1.select 얻기
           
           var date=new Date();
           var year_idx=0;
           //20살의 나이를 가진 년도에 selected
           var flag_year=date.getFullYear()-20+1;
           
           for(var i=1950; i<date.getFullYear()+1; i++){
                //2.select의 옵션 생성 Option(보여질값,  value값(넘겨줄값))
                b_year.options[year_idx]=new Option(i,i);
                if(flag_year==i){
                     b_year.selectedIndex=year_idx;
                }//end if;
                year_idx++;
           }//end for
           //b_year.options[50].selected = true;
          //b_year.options[50].setAttribute("selected","selected");
           
           //월 설정 1-12
           var b_month=obj.b_month;
           var month_idx=0;
           for(var i=1; i<13; i++){
                b_month.options[month_idx]=new Option(i,i);
                month_idx++;
           }//end for
           
           //일 설정 1-31
           var b_day=obj.b_day;
           var day_idx=0;
           for(var i=1; i<32; i++){
                b_day.options[day_idx]=new Option(i,i);
                day_idx++;
           }//end for
           
           //////////////////////////////////이벤트  등록/////////////////////////////////////////
          document.getElementById("idDup").addEventListener("click",popupCenter);
          document.getElementById("searchZip").addEventListener("click",popupCenter);
          document.getElementById("daumZip").addEventListener("click",execPostcode);
          document.getElementById("btnJoin").addEventListener("click",nullCheck);
           
          document.getElementById("pass2").addEventListener("blur",chkPass);
           
          document.getElementById("ssn1").addEventListener("keyup",moveSsn2);
          document.getElementById("ssn2").addEventListener("keyup",chkSsn);
           
     }//function-onload
     
     function moveSsn2(){
           //주민번호 앞자리에서 6글자가 입력되면 커서를 ssn2로  이동
/*         if(document.getElementById("ssn1").value.length==6){
                document.joinFrm.ssn2.focus();
           }//end if나나!! */
           var obj=document.joinFrm;
           if(obj.ssn1.value.length==6){
                obj.ssn2.focus();
           }//end if
           
           if(obj.ssn1.value.replace(/[0-9]/g,"")!=""){
                alert("주민번호는 숫자로만 구성됩니다.");
                obj.ssn1.value="";
                obj.ssn1.focus();
                return;
           }//end if
     }//moveSsn2
     
     function chkSsn(){
           //입력한 주민번호의 유효성 검증
           
     }//chkSsn
     
     function nullCheck(){
           //필수 입력값 체크
           
     }//nullCheck
     
     function chkPass(){
           //비밀번호가 일치 하는지 체크
           var obj=document.joinFrm;
           if(obj.pass1.value != obj.pass2.value){
                alert("비밀번호가 틀립니다.");
                obj.pass1.value="";
                obj.pass2.value="";
                obj.pass1.focus();
                return;
           }//end if
     }//chkPass
     
     function popupCenter(){
           var width=0;
           var height=0;
           var html="";
           var id=""
           
           if(this.id=="idDup"){
//              alert("아이디 중복확인");
                id="idDup";
                html="id_dup.html";
                width=502;
                height=303;
           }//end if
           if(this.id=="searchZip"){
//              alert("우편번호확인");
                id="searchZip";
                html="search_zip.html";
                width=408;
                height=419;
           }//end if  
           /* if(this.id=="daumZip"){
//              alert("다음");
//postcode.map.daum.net/guide
                id="daumZip";
                html="daum_zip.html";
                width=502;
                height=303;
           }//end if */
          window.open(html,id,"width="+width+",height="+height);           
     }//popupCenter
</script>
<style type="text/css">
</style>
<!-- script를 body에 넣었을때 에러가 발생하면 사용자는  에러메세지를 계속 클릭한 이후 제공하는 서비스를 볼 수 있다.
     script를 head에 넣었다면 에러가 발생하더라도 body는  에러메세지 없이 그대로 제공된다. -->
<script  src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
    //본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라,  내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을  설명합니다.
    function execPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할  코드를 작성하는 부분.
                // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을  가지므로, 이를 참고하여 분기 한다.
                var roadAddr = data.roadAddress; // 도로명 주소  변수
                var extraRoadAddr = ''; // 참고 항목 변수
                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로  끝난다.
                if(data.bname !== '' &&  /[동|로|가]$/g.test(data.bname)){
                    extraRoadAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment  === 'Y'){
                   extraRoadAddr += (extraRoadAddr !== '' ? ', '  + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한  최종 문자열을 만든다.
                if(extraRoadAddr !== ''){
                    extraRoadAddr = ' (' + extraRoadAddr + ')';
                }
                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('zipcode').value =  data.zonecode;
                document.getElementById("roadAddr").value =  roadAddr;
                //document.getElementById("jibunAddr").value =  data.jibunAddress;
                
                // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
                if(roadAddr !== ''){
                    document.getElementById("extraAddr").value =  extraRoadAddr;
                } else {
                    document.getElementById("extraAddr").value =  '';
                }
/*                 var guideTextBox =  document.getElementById("guide");
                // 사용자가 '선택 안함'을 클릭한 경우, 예상  주소라는 표시를 해준다.
                if(data.autoRoadAddress) {
                    var expRoadAddr = data.autoRoadAddress +  extraRoadAddr;
                    guideTextBox.innerHTML = '(예상 도로명 주소  : ' + expRoadAddr + ')';
                    guideTextBox.style.display = 'block';
                } else if(data.autoJibunAddress) {
                    var expJibunAddr = data.autoJibunAddress;
                    guideTextBox.innerHTML = '(예상 지번 주소 :  ' + expJibunAddr + ')';
                    guideTextBox.style.display = 'block';
                } else {
                    guideTextBox.innerHTML = '';
                    guideTextBox.style.display = 'none';
                } */
            }
        }).open();
    }
</script>
</head>
<body>
<div id="wrap">
<div id="joinHeader"></div>
<div id="joinContent">
     <form action="member.jsp" name="joinFrm">
           <table>
                <tr>
                     <td class="tdalign" colspan="2"><span  id="joinTitle">회원가입</span></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>아이디</td>
                     <td>
                           <input type="text" class="inputBox"  name="id" readonly="readonly" style="width:100px">
                           <button type="button" class="btn"  id="idDup">중복확인</button>
                     </td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>비밀번호</td>
                     <td><input type="password"  class="inputBox" name="pass1" style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>비밀번호  확인</td>
                     <td><input type="password"  class="inputBox" id="pass2" name="pass2"  style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>이름</td>
                     <td><input type="text" class="inputBox"  name="name" style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>주민번호</td>
                     <td><input type="text" class="inputBox"  name="ssn1" id="ssn1" style="width:60px" maxlength="6">
                           <label> - </label>
                           <input type="password"  class="inputBox" name="ssn2" id="ssn2" style="width:70px"  maxlength="7"></td>
                </tr>
                
                <tr>
                     <td>&nbsp;성별</td>
                     <td><input type="radio" value="남자"  name="gender" name="pass">남자
                           <input type="radio" value="여자"  name="gender">여자</td>
                </tr>
                
                <tr>
                     <td>&nbsp;생년월일</td>
                     <td>
                           <select name="b_year"  class="inputBox">
                           </select>
                           <label>년</label>                          
                           
                           <select name="b_month"  class="inputBox">
                           </select>
                           <label>월</label>    
                           
                           <select name="b_day"  class="inputBox">
                           </select>                  
                           <label>일</label>                          
                     </td>
                </tr>
                
                <tr>
                     <td>&nbsp;나이</td>
                     <td><input type="text" name="age"  class="inputBox" style="width:30px"></td>
                </tr>
                
                <tr>
                     <td>&nbsp;관심언어</td>
                     <td>
                     <input type="checkbox" value="Java"  name="interestlang">Java
                     <input type="checkbox" value="C/C++"  name="interestlang">C/C++
                     <input type="checkbox" value="Python"  name="interestlang">Python
                     <input type="checkbox" value="VB"  name="interestlang">VB
                     
                     <input type="checkbox" value="JSP"  name="interestlang">JSP
                     <input type="checkbox" value="Servlet"  name="interestlang">Servlet
                     <input type="checkbox" value="ASP"  name="interestlang">ASP
                     <input type="checkbox" value="php"  name="interestlang">php
                     </td>
                </tr>
                
                <tr>
                     <td>&nbsp;결혼여부</td>
                     <td><input type="radio" value="미혼"  name="marrigeFlag" checked="checked">미혼
                           <input type="radio" value="기혼"  name="marrigeFlag">기혼</td>
                </tr>
                
                <tr>
                     <td>&nbsp;결혼기념일</td>
                     <td><input type="text" maxlength="4"  name="m_year" class="inputBox" style="width:40px">년&nbsp;
                     <input type="text"  maxlength="2"  name="m_month" class="inputBox" style="width:20px">월&nbsp;
                     <input type="text"  maxlength="2"  name="m_day" class="inputBox" style="width:20px">일</td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>우편번호</td>
                     <td><input type="text" readonly="readonly"  name="zipcode1" class="inputBox" style="width:30px">
                           <label> - </label>
                           <input type="text"  readonly="readonly" name="zipcode2" class="inputBox"  style="width:30px">
                           변경된<input type="text"  readonly="readonly" name="zipcode" id="zipcode" class="inputBox"  style="width:50px">
                           &nbsp;<button type="button"  class="btn" id="searchZip">우편번호검색</button>
                           &nbsp;<button type="button"  class="btn" id="daumZip">다음우편번호검색</button></td>
                </tr>
                <tr>
                     <td><span class="span">*</span>주소</td>
                     <td>
                     <input type="text" readonly="readonly"  name="addr1" id="roadAddr" class="inputBox" style="width:200px">
                     참고 주소 : <input type="text"  id="extraAddr" class="inputBox"/>
                     </td>
                </tr>
                <tr >
                     <td><span  class="span">*</span>상세주소</td>
                     <td><input type="text" class="inputBox"  name="addr2" style="width:200px"></td>
                </tr>
                
                <tr valign="middle">
                     <td>&nbsp;가입인사</td>
                     <td><textarea name="greetings"  class="inputBox" style="width:250px; height:100px"></textarea></td>
                </tr>
                <tr>
                     <td colspan="2" class="tdalign">
                     <button type="button" class="btn"  id="btnJoin" onclick="">가입</button>&nbsp;
                     <button type="reset"  class="btn">초기화</button>
                     </td>
                </tr>
                <tr>
                     <td colspan="2"><span class="span">*는 필수  입력 사항입니다.</span></td>
                </tr>
           </table>
     </form>
     </div>
</div>
</body>
</html>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
     #wrap{width:408px; height: 419px; margin: 0px auto;  background: #FFFFFF url(images/zip_background.png) no-repeat;}
     #zipForm{text-align: center; padding-top: 50px; }
     #zipcodeContent{margin: 10px}
     table{border-spacing: 0px;}
     td,tr{border: 1px solid #333; text-align: center; }
     #zipTd{width:80px; }
     #addrTd{width:310px; }
</style>
<script type="text/javascript">
     function sendZip(zipcode,addr){
           //alert(zipcode+"/"+addr);
           //opener.window.document.부모창폼이름.value=부모창에  전달할 값;
           /*  opener.window.document.joinFrm.zipcode1.value=zipcode.substr(0,  zipcode.indexOf("-"));
          opener.window.document.joinFrm.zipcode2.value=zipcode.substr(zipcode.indexOf("-")+1);
           opener.window.document.joinFrm.addr1.value=addr;
           self.close();//내가한 부분 */
           
           //강사님 부분
           var openObj=opener.window.document.joinFrm;
           openObj.zipcode1.value=zipcode.split("-")[0];
           openObj.zipcode2.value=zipcode.split("-")[1];
           openObj.addr1.value=addr;
           
           openObj.addr2.focus();
           self.close();
     }//sendZip
</script>
</head>
<body>
     <div id="wrap">
     <div id="zipForm">
           <form name="zipFrm">
           <label>동이름</label>
           <input type="text" name="dong" class="inputBox">
           <input type="button" value="조회" class="btn">
           </form>
     </div>
     <div id="zipcodeContent">
           <table>
           <thead>
                <tr>
                     <th id="zipTd">우편번호</th>
                     <th id="addrTd">주소</th>
                </tr>
           </thead>
           <tbody>
                <tr>
                     <td><a  href="javascript:sendZip('111-111','서울시 강남구  역삼동')">111-111</a></td>
                     <td><a  href="javascript:sendZip('111-111','서울시 강남구  역삼동')">서울시 강남구 역삼동</a></td>
                </tr>
                <tr>
                     <td><a  href="javascript:sendZip('112-112','서울시 동대문구  동대문동')">112-112</a></td>
                     <td><a  href="javascript:sendZip('112-112','서울시 동대문구  동대문동')">서울시 동대문구 동대문동</a></td>
                </tr>
                <tr>
                     <td><a  href="javascript:sendZip('333-333','경기도 의왕시  의왕동')">333-333</a></td>
                     <td><a  href="javascript:sendZip('112-112','서울시 동대문구  동대문동')">경기도 의왕시 의왕동</a></td>
                </tr>
           </tbody>
           </table>
     </div>
     </div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
</style>
<!-- script를 body에 넣었을때 에러가 발생하면 사용자는  에러메세지를 계속 클릭한 이후 제공하는 서비스를 볼 수 있다.
     script를 head에 넣었다면 에러가 발생하더라도 body는  에러메세지 없이 그대로 제공된다. -->
<script  src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
    //본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라,  내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을  설명합니다.
    function execPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할  코드를 작성하는 부분.
                // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을  가지므로, 이를 참고하여 분기 한다.
                var roadAddr = data.roadAddress; // 도로명 주소  변수
                var extraRoadAddr = ''; // 참고 항목 변수
                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로  끝난다.
                if(data.bname !== '' &&  /[동|로|가]$/g.test(data.bname)){
                    extraRoadAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment  === 'Y'){
                   extraRoadAddr += (extraRoadAddr !== '' ? ', '  + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한  최종 문자열을 만든다.
                if(extraRoadAddr !== ''){
                    extraRoadAddr = ' (' + extraRoadAddr + ')';
                }
                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('zipcode').value =  data.zonecode;
                document.getElementById("roadAddr").value =  roadAddr;
                document.getElementById("jibunAddr").value =  data.jibunAddress;
                
                // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
                if(roadAddr !== ''){
                    document.getElementById("extraAddr").value =  extraRoadAddr;
                } else {
                    document.getElementById("extraAddr").value =  '';
                }
                var guideTextBox =  document.getElementById("guide");
                // 사용자가 '선택 안함'을 클릭한 경우, 예상  주소라는 표시를 해준다.
                if(data.autoRoadAddress) {
                    var expRoadAddr = data.autoRoadAddress +  extraRoadAddr;
                    guideTextBox.innerHTML = '(예상 도로명 주소  : ' + expRoadAddr + ')';
                    guideTextBox.style.display = 'block';
                } else if(data.autoJibunAddress) {
                    var expJibunAddr = data.autoJibunAddress;
                    guideTextBox.innerHTML = '(예상 지번 주소 :  ' + expJibunAddr + ')';
                    guideTextBox.style.display = 'block';
                } else {
                    guideTextBox.innerHTML = '';
                    guideTextBox.style.display = 'none';
                }
            }
        }).open();
    }
</script>
</head>
<body>
<input type="text" id="zipcode" placeholder="우편번호">
<input type="button" onclick="execPostcode()" value="우편번호 찾기">
<input type="text" id="roadAddr" placeholder="도로명주소">
<input type="text" id="jibunAddr" placeholder="지번주소">
<span id="guide" style="color:#999;display:none"></span>
<input type="text" id="extraAddr" placeholder="참고항목">
<br/>
<input type="button" value="사용" class="btn"/>
</body>
</html>

반응형