반응형
SMALL

생성자 함수


자바스크립트에서 메소드와 속성변수로 구성된 함수.

자바스크립트는 클래스가 없다.

때문에 개발자가 직접 생성자 함수를 제작해서 new를 이용해 객체를 생성한다.

관례적으로 생성자 함수는 첫 글자를 대문자로 쓰는 파스칼 표기법을 따른다.

 

<생성자 함수 형식>

function 생성자함수명( [매개변수1] ){
   this . 속성변수명 = 데이터1;
   this . 메소드명 = function( [매개변수2] ){
       실행코드;
       [return [데이터2]; ]
    }
};

또는 메소드 대신 생성자함수명.prototype. 메소드명 = function(~)~ 형태 사용.

생성자함수는 메모리공간에 올라가 객체화되고, 객체화 후에 메소드와 속성변수를 호출할 수 있다.

 

<예제1> 생성자 함수를 이용하여 3명의 학생의 성적을 출력해라.

1. Sungjuk 라는 이름의 생성자 함수 선언

<html>
<head>
	<meta charset="UTF-8">
	<script>
    //----------------------------------------------
    //생성자 함수 선언
    //----------------------------------------------
    function Sungjuk(s_no, s_name, kor, eng, mat){
   		
        //속성변수 선언
        this.s_no = s_no;
		this.s_name = s_name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat; 	
        
        //메소드 선언
        this.getS_no = function(){
			return this.s_no;
		}

		this.getS_name = function(){
			return this.s_name;
		}

		this.getTot = function(){
			var tot = this.kor + this.eng + this.mat;
			return tot;
		}

		this.getAvg = function(){
			var avg = this.getTot()/3;
			avg = Math.round(avg);
			return avg;
		}	
	}
	</script>	
</head>   

 

2. Sungjuk1,2,3 라는 이름의 생성자 함수 객체화

var sungjuk1 = new Sungjuk(1,"김솨솨",90,99,100);
var sungjuk2 = new Sungjuk(2,"전뫄뫄",99,88,77);
var sungjuk3 = new Sungjuk(3,"윤봐봐",100,22,11);

 

3. Sungjuk 객체의 메소드를 호출하여 얻은 데이터를 출력

<1>sungjuk 이란 변수 선언
<2>Sungjuk 이란 생성자함수를 메모리 공간에 올려 객체화
<3>메모리 공간에 올려진 Sungjuk이란 생성자 함수를 (1,90,20,77) 형식으로 호출
<4>Sungjuk 객체의 메모리 위치 주소값을 리턴하여 sungjuk 변수에 저장

	//김솨솨
    document.write("학번 : " + sungjuk1.getS_no() + "<br>" );
	document.write("이름 : " + sungjuk1.getS_name() + "<br>" );
	document.write("총점 : " + sungjuk1.getTot() + "<br>" );
	document.write("평균 : " + sungjuk1.getAvg() + "<br><br>" );
	//전뫄뫄
	document.write("학번 : " + sungjuk2.getS_no() + "<br>" );
	document.write("이름 : " + sungjuk2.getS_name() + "<br>" );
	document.write("총점 : " + sungjuk2.getTot() + "<br>" );
	document.write("평균 : " + sungjuk2.getAvg() + "<br><br>" );
	//윤봐봐
	document.write("학번 : " + sungjuk3.getS_no() + "<br>" );
	document.write("이름 : " + sungjuk3.getS_name() + "<br>" );
	document.write("총점 : " + sungjuk3.getTot() + "<br>" );
	document.write("평균 : " + sungjuk3.getAvg() + "<br><br>" );

결과창

 

<예제2> 랜덤으로 200개의 성적을 만들어 평균을 내고 등수로 내림차순 해라.

-> Sungjuk 이름의 생성자 함수를 만들어서 Array 객체 안에 저장 후 평균에 따라 내림차순 정렬

 

1. Sungjuk 라는 이름의 생성자 함수 선언(위 예제 1번과 동일)

<html>
<head>
	<meta charset="UTF-8">
	<script>
    //----------------------------------------------
    //생성자 함수 선언
    //----------------------------------------------
    function Sungjuk(s_no, s_name, kor, eng, mat){
   		
        //속성변수 선언
        this.s_no = s_no;
		this.s_name = s_name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat; 	
        
        //메소드 선언
        this.getS_no = function(){
			return this.s_no;
		}

		this.getS_name = function(){
			return this.s_name;
		}

		this.getTot = function(){
			var tot = this.kor + this.eng + this.mat;
			return tot;
		}

		this.getAvg = function(){
			var avg = this.getTot()/3;
			avg = Math.round(avg);
			return avg;
		}	
	}
	</script>	
</head>   

[생성자 함수] 속성변수 선언 형식은 this.속성변수명 = 데이터 이다.

[생성자 함수] 메소드 선언 형식은 this.메소드명 = function(~) {실행구문} 이다.

 

바디로 넘어가서 다시 스크립트를 연다.

 

2. Sungjuk 객체의 메모리 위치 주소값을 저장할 Array 객체 생성

-> 일단 Sungjuk 객체를 200개 만들기 전에 이것들을 넣어줄 집부터 만들어주자.

-> Array 객체는 빈집으로 만들어준다.

<body>
	<script>
    //Array 객체 생성
	var sungjuks = [];

 

3. Sungjuk 객체를 생성하고 반복문을 이용해서 200개 생성 후 Array 객체에 저장하기

-> 김뫄뫄씨 뒤에 숫자를 붙여서 구분해보자.

-> 점수 범위는 0~100사이로 설정해준다.

	//------------------------------------------
	//200개의 Sungjuk 객체를 생성하여 Array 객체에 저장하기
	//------------------------------------------
	for (var i=1; i<=200; i++){
		
		//랜덤한 국어점수 영어점수 수학점수 구하기
		var kor_tmp = Math.ceil( Math.random()*100 );
		var eng_tmp = Math.ceil( Math.random()*100 );
		var mat_tmp = Math.ceil( Math.random()*100 );

		//Sungjuk 객체를 생성하여 Array 객체에 저장하기
		sungjuks.push(   new Sungjuk(i+3, "전동순" +i, kor_tmp, eng_tmp, mat_tmp)   );
	}

꼭 Sungjuk 객체는 반복문 안에 생성해야 한다. 200개를 일일히 만드는 것과 다름이 없기 때문이다.

 

4. Array 객체 안의 배열변수에 저장된  Sungjuk 객체의 순서를 평균에 따라 내림차순으로 바꾸기

-> 즉, 평균이 높은 Sungjuk 객체의 메모리 위치 주소값을 맨 앞 배열변수로 옮기는 작업

-> i번째 배열변수의 평균과 j번째 배열변수의 평균 두개를 비교해서 j가 크면, 저장된 메모리 위치 주소값을 바꾼다.

-> 알맹이를 바꿔서 큰 것이 i로 가게 한 뒤 다시 다른것과 비교한다. 이러한 과정이 계속해서 반복되면 내림차순이 된다.

	//------------------------------------------
	//평균에 따라 내림차순으로 바꾸기
	//------------------------------------------
    
    //a번째와 a-1번째 비교
    for( var i=0; i<sungjuks.length-1 ; i++){
		for( var j=i+1; j<sungjuks.length ; j++){  //i보다 +1로 겹치지 않게
			
			//i번째 배열변수에 저장된 Sungjuk 객체의 평균 얻기
			var avg1 = sungjuks[i].getAvg();
			//j번째 배열변수에 저장된 Sungjuk 객체의 평균 얻기
			var avg2 = sungjuks[j].getAvg();
			
			//i번째 < j번째 이면, 서로의 값을 바꾸기
            if (avg1<avg2){
				var tmp = sungjuks[i];
				sungjuks[i] = sungjuks[j];
				sungjuks[j] = tmp;
			}
		}
	}

 

5. Array 객체를 넣을 table 생성

	document.write("<hr>학생성적<hr>");
	document.write("<table border=1 cellspacing=0 cellpadding=5>" );
	document.write("<tr><th>등수<th>학번<th>학생명<th>총점<th>평균" );

 

6. 반복문 사용해서 Sungjuk 객체의 값들 출력하기

-> 평균이 같으면 같은 등수로 두기

-> 평균을 비교해서 나보다 크면 rank 변수 안의 데이터 1 증가

-> 평균이 나와 같으면 그냥 건너뛰기

-> 나와 같은 등수가 많을수록 내 다음 랭크는 여러번 지나치기 때문에 차이가 벌어진다.

	//-----------------------------
	//평균이 같으면 같은 등수로 두기
	//-----------------------------
for (var i=0; i<sungjuks.length; i++){
		//등수를 저장할 변수를 선언하고 0 저장.
		var rank = 0;

		//i번째 Sungjuk 객체의 평균 얻기.
		var avg1 = sungjuks[i].getAvg();

		//i번째 Sungjuk 객체의 평균과 다른 Sungjuk 객체의 평균을 비교해서
		//i번째  Sungjuk 객체의 평균보다 큰 놈이 있다면 rank 변수 안의 데이터 1 증가시키기
		for( var j=0; j<sungjuks.length ; j++){
			//만약 나의 평균이면 그냥 건너 뛰기
			if(i==j){continue;}
			//j번째 Sungjuk 객체의 평균 얻기
			var avg2 = sungjuks[j].getAvg();
			//i번째 Sungjuk 객체의 평균보다 j번째 Sungjuk 객체의 평균이 크면
			//rank 변수 안의 데이터 1 증가하기
			if (avg1<avg2){rank++;}
		}

 

7. 반복문 사용해서 Sungjuk 객체의 평균값이 같으면 같은 색으로 지정하기

-> 평균 점수별로 삽입할 배경색을 저장할 변수 선언하기

		var bgcolor = "white";
		
		if(avg1>=100){bgcolor="blue";}
		else if(avg1>=90){bgcolor="gray";}
		else if(avg1>=80){bgcolor="red";}
		else if(avg1>=70){bgcolor="yellow";}
		else if(avg1>=60){bgcolor="purple";}
		else{bgcolor="lightblue";}

8. <tr>, <td> 태그 생성한 후 sungjuk들 출력하고 테이블 닫기.

-> 6번 for 문이 여기서 닫히는 것.

		//<tr> 태그 출력
		document.write("<tr bgcolor = "+ bgcolor + ">");

			

		//<td> 태그와 i번째 Sungjuk 객체의 등수, 학생번호, 학생명, 총점, 평균 출력
		document.write("<td>" + (rank+1) );
		document.write("<td>" + sungjuks[i].getS_no() );
		document.write("<td>" + sungjuks[i].getS_name() );
		document.write("<td>" + sungjuks[i].getTot() );
		document.write("<td>" + sungjuks[i].getAvg() );

}   //6번 for문 닫힘

		document.write("</table>" );
        
	</script>
</body>
</html>  

결과창

반응형
LIST
반응형
SMALL

DOM


DOM(= Document Object Model)

웹브라우저가 html 파일의 태그들을 읽어 객체를 생성하고, 이 객체에 대응하는 컨텐츠를 웹브라우저 화면으로 출력하는 일련의 과정 또는 모형을 말한다.

즉, XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스이며, 이 객체 모델은 문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공한다.

DOM 객체는 DOM API 를기반으로 생성되며 대부분의 웹브라우저는 동일한 DOM API 를 가지고 있다.

 

DOM 객체


HTML 문서 안의 태그를 읽어 만들어지는 객체를 DOM 객체라고 부른다.

 

유효성 체크


DB에 저장될 수 있는 데이터인가 아닌가를 체크하는 일련의 검사.

입력양식들의 유효성 체크를 한 후 모두 유효성에 합당하면 서버로 전송된다.

 

 

<예제> 회원가입창 유효성 체크하기


 

1. 유효성 체크를 위한 checkForm 함수 선언. 입력 양식들의 검사 방법을 정의한다.

<html>
 <meta charset="UTF-8">
  <head>
	<script>
    
    //저장 버튼을 누르면 호출되는 checkForm 함수 선언
    function checkForm(){
    		alert( "로그인 가능 이상 없음" );

저장버튼을 누르면 알림창이 뜬다.

에러가 없다면 또다른 메시지가 떠오르지 않지만 에러가 있다면 유효성 체크를 위한 새로운 창이 뜨도록 만든다.

 

1-1. 아이디

조건 : 첫글자 영어 소문자

두번째는 영어소문자 또는 숫자 또는 _ 중 하나

두번째 문자가 6~14개 나와야함. 즉, 전체문자 길이는 첫글자 포함 7~15자.

	//사용자가 웹브라우저 화면에서 입력한 [아이디값]을 가져와 uid 변수에 저장
	var uid = document.memberRegForm.uid.value;

	//공백 제거
	uid = uid.trim();

	//아이디 유효성 체크를 위해 RegExp 객체 생성
	var regExp = new RegExp( /^[a-z][a-z0-9_]{6,14}$/ );

	//만약 아이디가 잘못된 문자 패턴이면 경고하고 함수 중단
	if( regExp.test(uid)==false ){
		alert( "[아이디] 입력 규칙에 맞지 않음.\n<1> 영소문자 또는 숫자 또는 언더바(_)로 구성되어야함.\n<2> 글자수는 7~15자 사이 이어야함\n<3> 첫글자가 영문이어야함.\n" ); 


		//<유효성체크> 입력한 아이디 비우고 길이없는문자데이터 붙이기.
        //focus 사용해서 커서 아이디창에 있을 수 있도록 설정해주기.
		document.memberRegForm.uid.value="";
		document.memberRegForm.uid.focus();
		return;
	}

trim( ) : 앞 뒤 공백을 제거하는 제이쿼리 구문. 중간의 공백만 남기고 앞과 뒤의 공백은 모두 제거됨.

조건에 맞는 id 입력
조건에 맞지 않는 id 입력

 

1-2. 암호

조건 : 첫글자 영어 소문자 또는 숫자 중 하나

첫번째 문자가 6~14개, 즉, 전체 문자 길이는 7개~15개.

	//사용자가 웹브라우저 화면에서 입력한 [암호값]을 가져와 pwd 변수에 저장
	var pwd = document.memberRegForm.pwd.value;

	//공백 제거
	pwd = pwd.trim();

	//암호 유효성 체크를 위해 RegExp 객체 생성
	var regExp = new RegExp( /^[a-z0-9_]{8,15}$/ );

	//만약 암호가 잘못된 문자 패턴이면 경고하고 함수 중단
	if( regExp.test(pwd)==false ){
		alert( "[암호] 입력 규칙에 맞지 않음.\n<1> 영소문자 또는 숫자로 구성되어야함.\n<2> 글자수는 8~15자 사이 이어야함.\n" ); 


		//<유효성체크> 입력한 아이디 비우고 길이없는문자데이터 붙이기.
        //focus 사용해서 커서 아이디창에 있을 수 있도록 설정해주기.
		document.memberRegForm.pwd.value="";
		document.memberRegForm.pwd.focus();
		return;
	}

 

조건에 맞지 않는 암호 입력

 

1-3. 암호확인

조건 : 1. 암호 확인창이 빈칸이거나 2. 띄어쓰기로만 이루어져 있을 경우에는 [값 입력]유도

그 외의 경우(암호와 암호확인값이 같지 않을 경우)에는 에러메시지 출력.

	//사용자가 웹브라우저 화면에서 입력한 [암호확인값]을 가져와 pwd_confirm 변수에 저장
	var pwd_confirm = document.memberRegForm.pwd_confirm.value;
       
	if(      pwd_confirm=="" ||  new RegExp(/^[ ]+$/).test(pwd_confirm)        ){
			alert("[암호확인]을 입력해주세요.");
			
            //다시 빈칸으로 지워주기
            document.memberRegForm.pwd_confirm.value="";
			return;
	}
    
	else{
		if(pwd!=pwd_confirm){
			alert("[암호]와 [암호확인] 값이 같지 않습니다!");
			return;
		}
	}

암호와 암호확인이 동일하지 않을 때

 

1-4. 스킬

1개 이상 선택하게 하기. 체크박스를 사용한다.

	//스킬체크 변수 선언
    var skillCnt = 0;
	// i번째 스킬이 체크되어 있으면 변수 skillCnt 에 1 업데이트하기
	for( var i = 0 ; i < document.memberRegForm.skill.length ; i++ ){
		if( document.memberRegForm.skill[i].checked==true ) {
			skillCnt++;
		}
	}
	// skillCnt 가 0 이면(=아무것도 체크되어 있지 않으면) 경고하고 함수중단
	if(skillCnt==0)  { 
		alert("소유 스킬은 1개 이상 선택요망!");
		return;
	}

소유스킬을 선택하지 않음

1-5. 학력

1개는 무조건 선택하게 하기. 라디오 버튼을 이용한다.

	// 체크한 학력의 개수를 저장하는 변수 선언
	var  schoolCnt = 0;
	// i번째 학력이 체크되어 있으면 변수 schoolCnt 1 업데이트하기
	for( var i = 0 ; i <document.memberRegForm.school.length ; i++ ){
		if( document.memberRegForm.school[i].checked ) {
			schoolCnt++;
			break;
		}
	}
	// schoolCnt 가 0 이면(=아무것도 체크되 있지 않으면) 경고하고 함수중단
	if(schoolCnt==0)  { 
		alert("최종 학력은 1개 선택요망!");
		return;
	}

라디오버튼은 한번 선택하면 선택하지 않았던 상태로 돌아갈 수 없는 점이 특징이다.

최종학력 선택을 하지 않았을 때

 

1-6. 거주지

목록 작성 후 저장한다. 1개는 무조건 선택한다.

	// 선택한 [거주지]를 변수 addr 에 저장.
	var addr = document.memberRegForm.addr.value; 
	// 선택한 [거주지]가 없으면 경고하고 함수 중단
	if( addr=="" ){
		alert( "거주지 입력요망");
		return;
    }

 

1-7. 생일

가장 복잡하다. 생일은 단순하게 1월~12월, 1일~31일까지만 등록하면 될 것 같지만, 연도의 경우 몇년도까지 나오게 할 것인지, 2월 31일 등의 없는 날짜를 걸러주는 등의 추가 기능이 필요하다.

 

새로운 function이 필요하다.

유효성 체크를 위한 checkForm 함수 밖에 날짜 관련 함수를 선언한다.

//--------------------------------
// 년월일의 미래 날짜 여부 리턴하는 함수 선언하기
//--------------------------------
function is_future(year,month,date) {
	
    var result = false;
	
    var interval = 
		new Date().getTime() 
		- 
		new Date(
			parseInt(year,10)
			,parseInt(month,10)-1
			,parseInt(date,10)
		).getTime();
	
    if( interval<0 ){result = true;}
	
    return result;
}
//--------------------------------
// 생일의 유효성을 체크하는 함수 선언하기
//--------------------------------
function checkBirth(){

	//선택한 [생일]의 년,월,일을 변수 birth_year, birth_month, birth_date에 저장
	var birth_year = document.memberRegForm.birth_year.value; 
	var birth_month = document.memberRegForm.birth_month.value; 
	var birth_date = document.memberRegForm.birth_date.value; 
	
	if( birth_year=="" || birth_month=="" || birth_date==""){
		return;
	}

	if( is_valid_date(birth_year,birth_month,birth_date)==false  ) {
		alert("존재하지 않는 생일입니다. 다시 선택해 주삼!" );
		document.memberRegForm.birth_year.value = "";
		document.memberRegForm.birth_month.value = "";
		document.memberRegForm.birth_date.value = "";
		return;
	}
}
//--------------------------------
// 년월일이 실존 하는지의 여부를 체크하는 함수
//--------------------------------
function is_valid_date(year,month,date) {


	// 매개변수로 들어온 년도,월, 일을 진짜 정수 숫자로 바꾸기
	year = parseInt(year,10);
	month = parseInt(month,10);
	date = parseInt(date,10);

	// 매개변수로 들어온 년,월,일을  가지고 Date 객체 생성하기.
	var dateObj = new Date( year,month-1,date );
			
	// Date 객체에서 년월일을 뽑아내기
	var year2 = dateObj.getFullYear();
	var month2 = dateObj.getMonth()+1;
	var date2 = dateObj.getDate();
			
	// Date 객체에서 뽑아낸 년월일이 매개변수들어온 년,월,일과 같으면 true 리턴하기
	if( year==year2 && month==month2 && date==date2 ){return true;}
	// Date 객체에서 뽑아낸 년월일이 매개변수들어온 년,월,일과 같지 않으면 false 리턴하기
	else{return false;}			


}

checkForm 함수 안에서는 각 변수를 선언하고 빈칸일 경우 입력을 유도하는 경고창을 띄운다.

	// 선택한 생일의 년,월,일을 변수 birth_year,birth_month,birth_date 에 저장.
	var birth_year = document.memberRegForm.birth_year.value; 
	var birth_month = document.memberRegForm.birth_month.value; 
	var birth_date = document.memberRegForm.birth_date.value; 
			
	if( birth_year=="" ){
		alert( "생일 년도 입력요망");
		return;
	}
	if( birth_month=="" ){
		alert( "생일 월 입력요망");
		return;
	}
	if( birth_month=="" ){
		alert( "생일 일 입력요망");
		return;
	}

2020년 2월 31일은 존재하지 않는 날짜이다.

1-8. 주민번호

주민번호는 여러 조건이 있다. 입력창이지만 숫자만 입력해야하며, 뒷자리는 나와서는 안되고, 위의 생일처럼 존재하지 않는 날짜는 걸러줘야한다. 또한 미래 날짜라면 경고창을 띄워야 한다.

<조건>

1) 앞자리는 정수 숫자 6개, 뒷자리는 정수 숫자 7개 이어야함.

2) 주민번호에서 출생년도 2자리를 구한 후 19 또는 20을 붙여 온전한 출생년도 찾기.

3) 출생년월일이 존재하지 않는 날짜면 멈추고 경고창을 띄운다.

4) 출생년월일이 아직 오지 않은 미래 날짜면 멈추고 경고창을 띄운다.

 

조건을 하나하나 해결해보자.

 

0)변수선언

	// 입력된 주민번호 얻어와 변수 앞자리는 jumin_num1에 뒷자리는 jumin_num2에 저장
	var jumin_num1 = document.memberRegForm.jumin_num1.value; 
	var jumin_num2 = document.memberRegForm.jumin_num2.value; 

1) 앞자리는 정수 숫자 6개, 뒷자리는 정수 숫자 7개 이어야함.

	// 정수 숫자 6개를 검사하는 RegExp 객체 생성하기
	var regExp1  = new RegExp(/^[0-9]{6}$/);
    
    // 만약 주민번호 앞자리가  6자리 숫자가 아니면 경고하고 주민번호 초기화하고 함수 중단하기
	if( regExp1.test(jumin_num1)==false ){
		alert("주민번호 앞자리는 6자리 숫자이어야 합니다.재 입력바람!");
        //주민번호 초기화
		document.memberRegForm.jumin_num1.value = ""
        //함수 중단
		return;
	}
    
    
	// 정수 숫자 7개를 검사하는 RegExp 객체 생성하기
	var regExp1  = new RegExp(/^[1-4][0-9]{6}$/);
	// 만약 주민번호 뒤자리가 7자리 숫자가 아니면 경고하고 주민번호 초기화하고 함수 중단하기
	if( regExp1.test(jumin_num2)==false ){
		alert("주민번호 뒤자리는 첫 숫자는 1~4이어야하고, 모두 7자리 숫자이어야 합니다. 재입력바람!");
		//주민번호 초기화
        document.memberRegForm.jumin_num2.value = "";
		//함수 중단
        return;
	}

2) 주민번호에서 출생년도 2자리를 구한 후 19 또는 20을 붙여 온전한 출생년도 찾기.

	// 주민번호에서 출생년도,월,일 2자리씩 구하기
	var jumin_year = jumin_num1.substr(0,2);
	var jumin_month = jumin_num1.substr(2,2);
	var jumin_date = jumin_num1.substr(4,2);
    
    
	// 주민번호에서 출생년도 19 또는 20 구해서 출생년도 앞에 붙이기
	var first_num = jumin_num2.substr(0,1);
    
    //만약 주민번호 뒷자리 첫째자리(first_num)이 1또는 2라면 19, 3 또는 4라면 20을 붙여라.
	if( first_num=="1" || first_num=="2"  ){
		jumin_year = "19" + jumin_year;
	}
	if( first_num=="3" || first_num=="4"  ){
		jumin_year = "20" + jumin_year;
	}

3) 출생년월일이 존재하지 않는 날짜면 멈추고 경고창을 띄운다.

	// 출생년월일이 존재하지 않는 날짜면 경고하고 함수 중단하기
	if( is_valid_date(jumin_year,jumin_month,jumin_date)==false ){
		alert("주민번호 앞자리는 존재하지 않는 년월일 입니다.");
		document.memberRegForm.jumin_num1.value = ""
		document.memberRegForm.jumin_num2.value = ""
		return;
	}

4) 출생년월일이 아직 오지 않은 미래 날짜면 멈추고 경고창을 띄운다.

	//출생년월일이 미래 날짜면 경고하고 함수 중단하기
	if( is_future(jumin_year,jumin_month,jumin_date)  ){
		alert("주민번호 출생년월일이 미래 입니다.");
		document.memberRegForm.jumin_num1.value = ""
		document.memberRegForm.jumin_num2.value = ""
		return;
	}

1-9. 파일 선택

파일도 무조건 선택하게 한다.

	//파일 선택 안하면 경고창
    if(  document.memberRegForm.pic.value=="" ) {
		alert("파일 선택은 필수입니다!");
		return;
	}

1-10. 숙지사항 체크하기

체크가 false이면 경고창이 뜨게 한다.

	if(  document.memberRegForm.is_confirm.checked==false ) {
		alert("숙지사항은 필수 체크입니다!");
		return;
	}

 

여기까지 스크립트는 끝. 바디로 넘어가자.

}

	</script>
</head>

 

2. <body> 태그 안에서 <form> 태그로 UI를 만든다. 테이블 형태로 깔끔하게 한다.

<body>
<form name="memberRegForm">

//테이블 만들기
	<table border=1 cellpadding=7 cellspacing=0>
		<tr>
			<th>아이디 <--!텍스트-->
			<td> <input type="text" name="uid" size=8>
		</tr>
		<tr>
			<th>암호 <!--암호-->
			<td><input type="password" name="pwd" size=8 >
		</tr>
		<tr>
			<th>암호확인 <!--암호-->
			<td><input type="password" name="pwd_confirm" size=8 >
		</tr>
		<tr>
			<th>소유스킬 <!--체크박스->
			<td>
				<input type="checkbox" name="skill" value="Java">Java
				<input type="checkbox" name="skill" value="JSP">JSP
				<input type="checkbox" name="skill" value="Spring">Spring
				<input type="checkbox" name="skill" value="Oracle">Oracle
				<input type="checkbox" name="skill" value="mybatis">mybatis
		</tr>
		<tr>
			<th>최종학력  <!--라디오버튼-->
			<td>
				<input type="radio" name="school" value="고졸">고졸
				<input type="radio" name="school" value="전문대졸">전문대졸
				<input type="radio" name="school" value="일반대졸">일반대졸
		</tr>
		<tr>
			<th>거주지역 <!--select 박스-->
			<td>
				<select name="addr">
					<option value="">-선택-
					<option value="서울">서울
					<option value="경기">경기
					<option value="인천">인천
					<option value="전라도">전라도
					<option value="경상도">경상도
					<option value="강원도">강원도
					<option value="충청도">충청도
					<option value="제주도">제주도
					<option value="기타">기타
				</select>
		</tr>
		<tr>
			<th>생일  <!--select 박스-->
			<td>
				<select name="birth_year" onChange="checkBirth();">
					<option value="">
					<script>
						for( var i=2000 ; i<=2020  ; i++ ){
							document.write( "<option value="+i+">"+i );
						}
					</script>
				</select>년
				<select name="birth_month" onChange="checkBirth();">
					<option value="">
					<script>
						for( var i=1 ; i<=12; i++ ){
							if( i<10 )
								document.write( "<option value=0"+i+">0"+i );
							else
								document.write( "<option value="+i+">"+i );
						}
					</script>
				</select>월
				<select name="birth_date" onChange="checkBirth();">
					<option value="">
					<script>
						for( var i=1 ; i<=31; i++ ){
							if( i<10 )
								document.write( "<option value=0"+i+">0"+i );
							else
								document.write( "<option value="+i+">"+i );
						}
					</script>
				</select>일
		</tr>
		<tr>
			<th>주민번호 <!--텍스트-->
			<td>
				<input type="text" name="jumin_num1" maxlength=6 > -
				<input type="password" name="jumin_num2" maxlength=7>
		</tr>
		<tr>
			<th>사진 <!--파일-->
			<td>
				<input type="file" name="pic">
		</tr>
		<tr>
			<th>숙지사항 <!--체크박스-->
			<td>
				입력하신 개인 정보는 회사 소유 입니다.
				<input type="checkbox" name="is_confirm" value="확인">확인
		</tr>


	</table>
</form>

	<!--저장버튼을 만든다. 저장버튼을 누르면 checkForm() 함수가 시행된다.-->
	<input type="button" value="저장" onClick="checkForm()">

</body>
</html>

회원가입창 만들기 예제와 DOM 객체 공부 끝.

반응형
LIST
반응형
SMALL

Window 객체


자바스크립트에서 웹화면(브라우저) 전체를 담당하는 전역 객체.

브라우저 전체를 담당하는 Window 객체 안에는 여러 내장 객체들이 속해있다.

<Window 객체 안의 내장 객체>

Frame 객체 : 2개 이상의 문서가 조합되어 만들어지고 배열로 이루어져 있는 객체. 프레임을 제어한다. length를 이용해서 프레임의 갯수를 알 수 있고, 각 프레임의 정보에 접근 가능.

Location 객체 : 현재 열려진 웹 화면의 URL 주소와 관련된 정보 제공.

History 객체 : 웹 브라우저의 히스토리(방문한 적이 있는 URL 주소)를 관리.

Document 객체 : 문서의 정보(제목, 변경날짜, 시간 등)를 관리. 원하는 내용을 출력하거나 문서의 정보를 제공해준다.

ex)document.getElementById : 주어진 문자열과 일치하는 id 속성을 가진 요소를 찾고, 이를 나타내는 Element 객체를 반환. ID는 문서 내에서 유일해야 하기 때문에 특정 요소를 빠르게 찾을 때 유용

ex) Document.querySelector() : ID가 없는 요소에 접근. 모든 선택자를 사용가능

Document 객체는 방대하기 때문에 메소드를 그때그때 찾아 봐야 한다.

 

객체 생성 없음

 

<메소드 호출>

window.메소드(~)

 

<속성변수 호출>

window.속성변수

window는 웹브라우저가 제공하는 Window의 객체참조변수이다.

window 객체 메소드
open(url, 창이름, 창옵션) 새로운 웹화면 생성하고 그 화면을 관리하는 window 객체 생성
close() 웹화면 닫음
alert(메시지) 확인버튼이 있는 대화상자를 보여줌
confirm(메시지) 확인, 취소버튼이 있는 대화상자를 보여줌
prompt(메시지) 입력상자가 있는 대화상자를 보여줌
setTimeout("java script 코드", n초 * 1000) n초 뒤에 "java script 코드" 실행.
setTimeout(function(~){java script 코드}, n초 * 1000)도 가능
clearTimeout() setTimeout 메소드를 정지
setInterval("java script 코드", n초 * 1000) n초 마다 "java script 코드" 실행.
setInterval(function(~){java script 코드}, n초 * 1000)도 가능
clearInterval() setInterval 메소드를 정지
find( 찾을문자 ) 원하는 문자열 찾기
moveBy( x , y ) 웹화면을 지정한 상대적 위치로 이동
moveTo( x , y ) 웹화면을 지정한 절대적 위치로 이동
resizeBy( x , y ) 웹화면을 지정한 상대적 크기로 이동
resizeTo( x , y ) 웹화면을 지정한 절대크기로 이동
scrollBy( x , y ) 웹화면의 스크롤 위치를 지정한 상대적 위치로 이동
scrollTo( x , y ) 웹화면의 스크롤 위치를 지정한 절대적 위치로 이동
focus() 초점 맞춤. 텍스트창의 경우, 커서를 위치시켜서 바로 입력 가능하게 만듬. 버튼의 경우, 엔터키를 눌렀을 때 클릭효과.
blur() focus()의 반대로 초점 제거. fucus() 제거 또는 창 최소화
addEventListener( "load", 호출함수명, false ) body 태그 안의 내용물을 다 읽어들인 후 특정 이벤트가 발생했을 시 특정 함수를 실행. load 대신에 다른 이벤트명을 지정할 수 있다. 
기타 등등....
window 객체 속성변수
opener open() 메소드 사용해서 열린 웹화면의 window 객체 저장
innerHeight 실제 문서가 출력될 부분의 높이 저장
innerWidth 실제 문서가 출력될 부분의 넓이 저장
outerHeight 화면 전체의 높이 저장
outerWidth 화면 전체의 넓이 저장
locationbar 창에 제목표시줄 표시 여부
personalbar 창에 personal도구모음 표시 여부
scrollbar 창에 스크롤바 표시 여부
statusbar 창에 상태표시줄 표시 여부
toolbar 창에 툴바(도구창) 표시 여부
status 상태표시줄 문자 변경
defaultStatus status를 설정하지 않았을 때 기본적으로 표시할 내용
 특정 이벤트가 발생했을 시 특정 함수를 실행 body 태그 안의 내용물을 다 읽어들인 후 실행할 함수명을 지정.
기타 등등....

 

<예제1-1> 5초 뒤에 Tistory 페이지로 이동하기

 <html>
 <head>
	<script>
    function move_5_sec(){
		window.setTimeout(
			"location.replace('http://www.naver.com');" , 5*1000
		);
	}
	</script>
</head>

<body onLoad = "move_5_sec();"> // body 태그 안의 내용을 모두 읽어 실행한 후 move_5_sec 함수호출
5초 뒤 페이지 이동합니다.<center>
</body>
</html>

- Window 객체의 setTimeout(~,~) 메소드로 지정한 시간 뒤에 페이지를 이동한다.

- Location 객체의 replace 메소드 호출 형식) window.location.replace("이동할 URL 주소")

이동할 URL 주소로 현재 페이지가 바뀐다. 위 replace 메소드 대신에 아래처럼 href 속성변수에  "이동할 URL 주소" 설정해도 현재 페이지가 바뀐다. Location 객체의 메위주는 location 변수에 저장되어 제공한다. -> location.herf = "이동할 URL 주소" 

 

<예제1-2> 5초 뒤에 Tistory 페이지로 이동하기. 단, 화면에 5,4,3,2,1로 카운트다운 세기.

 <html>
 <head>
	<script>
    //변수 num 선언
    var num = 5;
    //countdown 함수 선언
    function countdown(){
    	//document 객체의 document.getElementById 메소드 사용 : id 있는 곳에 시간문자 삽입
		document.getElementById("second").innerHTML = 5; 
        
        //window 객체의 setInterval 메소드 : n초마다 실행
		window.setInterval( 
       		//실행할 코드
       		function(){			
			document.getElementById("second").innerHTML = --num;			
			if(num==1){location.replace("https://heannim-world.tistory.com/");}			
			}
        	//n초마다 실행
     	   , 1*1000);
	}
	</script>
</head>

 <body onLoad = "countdown();"><center>
 	//문자열 삽입
	 <span id = "second"></span>
</body>
</html>

- document 객체의 document.getElementById 메소드 : id = "nowTime" 가 있는 태그 영역 내부에 시간 문자열 삽입

-> 시간 문자열이 "second"

- setInterval("java script 코드", n초 * 1000) : n초마다 "java script 코드"실행

-> 실행할 때마다 1씩 줄어들고, 만약 num이 1이라면 그 다음 페이지를 이동시킨다.

반응형
LIST
반응형
SMALL

.prompt( "윈도우 문자열" , "입력창 문자열" )


자바스크립트 자체에서 미리 만들어져 제공하는 내장함수의 한 종류이다.

 "윈도우 문자열" 은 프롬프트에 띄워줄 메시지이고, "입력창 문자열" 은 입력창에 미리 삽입되는 문자열이다.

입력창을 공백으로 유지하고 싶은 경우 ""로 둔다. (이 경우, defalt값이 들어가 있는 것.)

입력창을 만들기 원하지 않을 경우 "입력창 문자열" 을 생략한다.

Internet Explorer 프롬프트 창
Chrome 프롬프트창
입력창 문자열을 입력했을 경우

 

.alert( "윈도우 문자열"


alert는 입력한 메시지만 전달한다. 반환하는 값이 없다.

 

alert 상자 : 변수 안의 데이터가 "abc" 가 아닐 때

 

.confirm( "윈도우 문자열" )


confirm은 true 또는 false 값을 반환한다.

확인을 누르면 true를 리턴하고 취소를 누르면 false를 리턴한다.

 

confirm 상자 : 확인(true), 취소(false)
확인을 누르면 다음 구문이 실행된다.

 

 

<예제1> 간단한 아이디 암호 입력창을 만들어보자.

 

1. 변수 ID를 선언하고 안에 데이터가 "abc"면 반복문 중단, 아니면 alert 상자 띄우기

while(true){
			
	//변수 ID 선언
	var id = prompt("아이디 입력 요망","");
			
	//id 변수 안의 데이터가 "abc"면 반복문 중단
	if(id=="abc"){ break; }
			
	//id 변수 안의 데이터가 "abc"가 아니면 alert 상자 띄우기
	else{ alert("아이디가 틀립니다. 재입력 요망"); }

}

 

2. 변수 pwd를 선언하고 안에 데이터가 "123"면 반복문 중단, 아니면 alert 상자 띄우기

while(true){
			
	//변수 pwd 선언
	var pwd = prompt("암호 입력 요망","");
			
	//pwd 변수 안의 데이터가 "123"면 반복문 중단
	if(pwd=="abc"){ break; }
			
	//id 변수 안의 데이터가 "123"가 아니면 alert 상자 띄우기
	else{ alert("암호가 틀립니다. 재입력 요망"); }

}

 

3. 변수 login을 선언하고 안에 ture를 리턴하면 다음 구문 실행, 아니면 멈춤.

var login = confirm("로그인 하시겠습니까?");
document.write( "로그인 되었습니다." );

 


<예제2> 아이디 암호 입력 횟수를 제한해보자.

 

1. 아이디와 암호 입력 횟수를 저장하는 변수를 선언

//아이디 잘못 입력 횟수 저장하는 변수 선언
var id_error_cnt=0;

//암호 잘못 입력 횟수 저장하는 변수 선언
var pwd_error_cnt=0;

//아이디 잘못 입력 기회 횟수 저장 변수선언
var id_chance_cnt=3;

//암호 잘못 입력 기회 횟수 저장 변수선언
var pwd_chance_cnt=3;

 

2. ID, pwd 변수를 선언하고 안에 데이터가 "abc", "123"면 반복문 중단, 아니면 잘못 입력 횟수 증가

while(true){

	//변수 ID 선언
	var id = prompt("아이디 입력 요망","");
			
	//id 변수 안의 데이터가 "abc"면 반복문 중단
	if(id=="abc"){break;}
	
	//id 변수 안의 데이터가 "abc"가 아니면 아이디 잘못입력 횟수 증가
	else{id_error_cnt++;}
		
	//만약 아이디 잘못 입력 횟수가 3회 이상이면 반복문 중단
	if(id_error_cnt>=id_chance_cnt){break;}
}

		
//만약 아이디 잘못 입력 횟수가 3 미만이면
if(id_error_cnt<id_chance_cnt){

	//맞는 암호를 입력 받을 때까지 계속 반복하는 반복문 선언
	while(true){
    
    	//변수 pwd 선언
		var pwd = prompt("암호 입력 요망","");
        
        //pwd 변수 안의 데이터가 "123"면 반복문 중단
		if(pwd=="123"){break;}
        
  		//pwd 변수 안의 데이터가 "123"가 아니면 암호 잘못입력 횟수 증가      
		else{pwd_error_cnt++;}
        
        //만약 암호 잘못 입력 횟수가 3회 이상이면 반복문 중단
		if(pwd_error_cnt>=pwd_chance_cnt){break;}
	}
}

-> while문 안에 if - else - if 형식으로 있어서 로직이 복잡해 보일 수 있다. 

    변수 선언 후 프롬프트 입력창에 abc가 출력되거나(if) 출력되지 않는(else) 두가지 경우의 수 갈림길에 선다.

    반복문이 중단되는 경우는 abc가 출력되지 않은 else 이후이다.

    즉, else까지 종료된 첫 번째 조건문 이후에 수행되는 두번째 조건문이며,

    입력값이 abc일 경우 break; 되어 두 번째 if문에 도착하지 않는다.

 

3. 로그인 결과 출력하기

//만약 id_error_cnt 변수 안의 데이터가 id_chance_cnt 변수 안의 숫자보다 같거나 크다면
if(id_error_cnt>=id_chance_cnt){
	//로그인 실패 출력
	document.write( "아이디 "+ id_error_cnt + "회 잘못 입력으로 로그인 실패");
}

//만약 pwd_error_cnt 변수 안의 데이터가 pwd_chance_cnt 변수 안의 숫자보다 같거나 크다면
else if(pwd_error_cnt>=pwd_chance_cnt){
	//로그인 실패 출력
	document.write( "암호 "+ pwd_error_cnt + "회 잘못 입력으로 로그인 실패");
}

//그 외의 경우라면(=로그인이 성공한 경우)
else{document.write( id + "님! 방문을 환영합니다.");}

 


<예제3> 함수를 이용해서 로그인 창을 만들어보자.

 

1. 전역변수 선언

var idErrorCnt = 0; //아이디 입력 실패 횟수 저장
var pwdErrorCnt = 0; //암호 입력 실패 횟수 저장
var lastChance = 3;  //입력 실패 허용 횟수 저장

 

2. 아이디를 체크하는 함수 선언

function check_id(){
	var id = prompt("아이디 입력 요망","");

	//만약 아이디가 "abc"가 아니면 idErrorCnt 변수 안의 데이터 1 증가
	if (id!="abc"){idErrorCnt++;

		//만약 아이디가 idErrorCnt 변수 안의 데이터가 3미만이면 check_id() 함수 호출
		if(idErrorCnt<lastChance){check_id();}
	}
}

-> <예제2>와 다르다. 이 경우, function 속 조건문 안에 또다른 조건문이 있는 형식이다.

    변수 선언 후 프롬프트 입력창에 abc이 아니면(if) idErrorCnt를 1 증가시킨다.(실행구문)

    그 후 if으로 내려가서 idErrorCnt가 lastChance보다 작은지 확인한다. 

    프롬프트창은 사라지지 않았기 때문에 결과값이 작으면 또다시 입력창에 아이디를 입력할 수 있다.

    때문에 idErrorCnt가 설정한 값 이상이 될 때까지 반복된다.

    반복문이 중단되는 경우는 idErrorCnt가 lastChance보다 커졌을 경우이다.

 

3. 암호를 체크하는 함수 선언

function check_pwd(){
	var pwd = prompt("암호 입력 요망","");

	//만약 암호가 "123"이 아니면 pwdErrorCnt 변수 안의 데이터 1 증가
	if (pwd!="123"){pwdErrorCnt++;

		//만약 암호가 pwdErrorCnt 변수 안의 데이터가 3미만이면 check_pwd() 함수 호출
		if(pwdErrorCnt<lastChance){check_pwd();}
	}
}

<주의>check_id()함수가 완전히 끝나야 check_pwd() 함수가 실행되고, check_pwd() 함수가 실행되고 완전히 끝나야 "로그인 성공"을 출력한다.

 

3. 프로그램 전체를 컨트롤하는 함수 선언

function control(){

	//check_id() 함수 호출.
	check_id();

	//만약 아이디 입력 실패가 3번이면 경고하고, 로그인 실패 메시지를 출력하고 함수 중단하기.
	if(idErrorCnt==lastChance){
		document.write("[아이디]" + lastChance + "회 잘못 입력으로 로그인 실패");
		return;
	}

	//check_pwd() 함수 호출.
	check_pwd();

	//만약 암호 입력 실패가 3번이면 경고하고, 로그인 실패 메시지를 출력하고 함수 중단하기.
	if(pwdErrorCnt==lastChance){
		document.write("[암호]" + lastChance + "회 잘못 입력으로 로그인 실패");
		return;
	}
}

return(); -> 함수에서 return이 나오면 그 자리에서 멈추고 오른쪽 값을 주는 것.

break; -> 반복문에서 어떠한 조건을 달성하면 멈춤.

따라서 만약 에러횟수와 기회가 같으면, 문구를 출력하고 난 뒤 return;에서 함수 시행을 멈춘다.

 

<주의> check_id()함수에서 id를 3회 이전에 맞추거나 3회 이상 틀리면 함수가 종료되어 다음 코딩이 실행된다.

          check_pwd()함수에서 pwd를 3회 이전에 맞추거나 3회 이상 틀리면 함수가 종료되어 다음 코딩이 실행된다.

 

4. control() 함수를 실행한다.

control();

 

반응형
LIST
반응형
SMALL

+ Recent posts

반응형
LIST