반응형
SMALL

자바스크립트(java script)는 HTML 언어에 추가되서 웹페이지를 동적으로 다양하게 제작할 수 있게 도와주는 스크립트 언어이다. 스크립트 언어는 혼자 실행될 수 없어서 다른 언어에 포함되어 실행되고, 문법이 복잡하지 않은 특징을 가지고 있다. 즉, 자바스크립트는 HTML 안에서만 구현된다. 공식 명칭은 [ECMAScript]

 

<html 문서 내의 언어들>

이름 특징 태그
태그 컨텐츠 출력 <hr>, <font> 등
CSS 디자인 담당 <style="color: blue">~</style>
java script 동적인 조작 기법 <script> ~ </script>

 

자바 스크립트 기능

1. 유효성 체크 : 데이터가 DB에 저장될 수 있는지, 부족한 것은 없는지 검사

2. 태그 속성값 또는 태그 자체의 입력/수정/삭제 : html의 태그 컨트롤

3. AJAX를 통한 웹서버와의 데이터 통신

4. 동적인 메뉴 제작, 이미지 효과

 

AJAX: 비동기 방식으로 웹서버와 통신한 후에 통신 결과물을 화면에 반영하는 기술들의 총칭.

비동기 방식: 페이지 이동 없이 웹서버와 통신하는 방식 (예 : ID 중복 검사, 연관검색어 등)

 

자바 스크립트 특징

  • HTML 소스 코드 안에 삽입되어 웹브라우저에 결과 출력 -> 소스가 클라이언트에게 노출. 보안성이 낮다.
  • AJAX를 사용하여 간접 DB연동 가능(자바는 직접 DB 연동)
  • 문법이 자바나 C보다 쉽다. 모든 변수의 형식을 검사하지 않기 때문. 때문에 에러 발생 시 찾기가 힘들다.
  • 화면 출력이 목적!

 

자바스크립트 형식

자바 스크립트 형식

<script> ~ </script> 안에 삽입되어 사용된다. 

함수인 경우 관용적으로 head 안에 있는 편.

자바 스크립트 수입

스크립트가 너무 길면 확장자를 js로 설정하여 독립된 파일을 만든다.

필요 시에 html 파일에 수입해서 삽입할 수 있다.

 

<자바스크립트 자료형>

자료형 종류 설명
숫자형 정수, 실수 데이터.
문자형 문자데이터. "로 감싼다. ""는 길이 없는 문자데이터.
boolean 형 true / false 데이터.
함수형 function(){실행구문;} 형태의 데이터.
1. 함수 전체를 데이터의 한 종류로 취급 (변수에 저장 가능)
2. 이름이 없을 수 있음.(=익명함수)
객체형 속성변수와 메소드로 구성된 단위 프로그램을 객체화했을 때 객체가 차지하는 메모리 공간의 위치 주소값.
ex) var aaa = new nnn();
undefined 형 알수없는 데이터. 프로그램에서 사용할 수 없는 데이터. 위의 5가지가 아닌 모든 것의 자료형을 말한다.(null이 아님)

 

자바스크립트 변수

var 변수명 = 데이터;

변수는 세 종류가 있다.

1. 전역변수 : var가 있거나 없거나. 모든 자바스크립트에서 공유 가능한 변수

2. 지역변수 : 함수 안에서 var로 선언되어 함수 안에서만 사용되는 함수. 전역변수랑 헷갈릴 수 있음.

3. 매개변수 : 함수 호출 시 전달되는 데이터를 저장하는 변수다. 함수 안에서만 사용 가능(함수 오른쪽에 위치). 앞에 var 없음.

 

변수 선언 형식

var aaa;  //undefined

var aaa = 5; //변수 선언

var aaa; //선언 후 데이터 넣기
aaa = 5;

 

데이터 자료형

var aaa = "123";  //문자형
var aaa = "123";  //숫자형
var aaa = boolean("n");  //논리형

논리형의 경우, 하단 "자바스크립트 조건문" 참고.

<참고> 자료형을 출력해보려면 typeOf를 사용한다. ex) document.write( typeOf aaa );

 

자바스크립트 연산자

1. ===연산자

자바와 동일.

단, 비교 연산자에서 ===의 경우 좌우가 같으면 true를 리턴한다. (자바에 없는 연산자)

true가 리턴되려면 자료형이 같아야한다. 자료형이 다르면 다른 유형의 데이터를 비교하는 것으로, 무조건 false가 리턴된다.

<주의> 자바는 [숫자]와 [숫자문자] 간의 비교가 불가능했으나, 자바스크립트는 [숫자문자]가 [숫자]로 변환되어 비교된다.

"10" == 10  //true, 자료형상관x

"10" === 10 //false, 자료형 일치해야함.

 

2. 문자 결합 연산자

"문자" + "문자" = "문자문자";  //문자끼리 더하면 문자
"문자" + 123 = "문자123";   //문자+숫자는 문자화

 

3. 삼항조건연산자

var aaa = a>b ? "맞아" : "아냐";

a가 b보다 클 때(조건식), 삼항조건연산자 ? 의 출력값 리턴. true일 경우 "맞아", false일 경우 "아냐" 출력.

 

 

자바스크립트 조건문

if(조건식1){ 실행구문; }

조건식 자리에는 boolean 형으로 true, false가 온다.(비교 연산식 또는 논리연산식이 나옴)

조건식 자리에 boolean 형이 아닌 데이터가 올 수 있다.

비어있거나(null), "",'' 등 길이가 없는 문자데이터 또는 0이 나오면 false로 형변환이 되고, 그 이외의 데이터는 true로 변환된다.

예)if(5){ 실행구문; } -> true일 때 실행구문을 실행하는 것.

 

자바스크립트 객체

ex) TV

기능(메소드) : 켜다(), 끄다()   -> 호출 : 객체.메소드(~);

속성 : 높이, 색상, 무게 등  -> 호출 : 객체.속성; 또는 객체.속성 = 값;

 

종류

1. 내장 객체 : 엔진에 이미 만들어져 저장.

ex) 문자, 날짜, 배열, 수학 등

생성 방법

var 변수명 = new Object(); //기본
var 변수명 = new Date(); //날짜
var 변수명 = new Math(); //수학
var 변수명 = new Array(); //배열
var 변수명 = new String(); //문자열

변수가 기본객체생성함수( Object(); )메소드를 참조중.

 

 

2. 브라우저 객체(BOM) : 브라우저에 계층구조로 내장되어 있음.

ex) Window(document, location) , Screen, Location, History, Navigator, Event

 

3. 문서객체(DOM) : html 문서 구조.

ex) <html>, <head>, <body> 등의 태그

-> 이러한 구조를 파악해야 원하는 곳에 원하는 기능을 넣을 수 있음.

-> 문서객체 대신에 jQuery 문서 객체 모델 사용이 많다.

 

자바스크립트 함수

자바의 메소드와 유사하다.

[실행구문]에 이름을 붙여 선언한 후 필요시점에 이름을 호출하여 실행구문을 실행하는 일종의 단위 프로그램.

-> 반복 사용하는 실행구문을 함수로 만들어 놓으면 보관이 용이하고 언제든지 쉽게 호출 가능하다.

함수는 반복 호출이 가능하고, 함수명을 호출해야 함수 내용이 실행된다. 호출 전에는 실행되지 않는다.

 

<자바스크립트 함수 종류>

함수 종류 설명
정적함수 함수명을 붙여 선언하는 함수
-> 웹브라우저는 정적함수를 먼저 골라 읽어드린 후 나머지 코딩을 실행하기 때문에 관용적으로 위쪽에 써준다.
<주의> 동일한 이름의 정적함수가 2개면, 마지막 정적함수가 진짜 정적함수다.
익명함수 함수명 없이 선언하는 함수로 주로 변수에 저장한다.(=데이터의 한 종류)
매개변수는 0개 이상 나올 수 있으며, 함수 호출 시 return 반환값;이 나오면 함수 중단 후 반환값을 호출한 곳으로 리턴한다. 그냥 return;만 나오면 함수 중단.
내장함수 자바스크립트에 이미 만들어져 제공하는 함수
내부함수 함수 내부에 선언된 또다른 함수
<주의> 내부함수와 외부함수의 이름이 같을 경우 [부모함수] 안에서 [내부함수]를 호출할 때 [내부함수]가우선적으로 호출된다.
사용자 정의 함수 개발자가 만들어서 사용하는 함수
콜백함수 직접 호출하지 않고 나중에 필요시에 호출해서 사용하라고 전달해주는 함수.
예) setTimeout( function(~){실행구문;}, 초숫자 );

 

객체 생성자 함수

function 함수명( 매개변수1, 매개변수2, ... , 매개변수n){
   this.속성명 = 새 값;
   this.함수명 = function(){실행구문;}
}

var 참조변수(인스턴스 네임) = new 함수명();
var 참조변수 = {  속성 : 새값, 함수명 : function(){~}  }
반응형
LIST
반응형
SMALL

Event 객체


자바스크립트 BOM 객체(브라우저 객체)  웹화면에서 발생하는 모든 움직임을 관리하는 객체.

 

객체 생성은 없음.

 

<속성변수 호출>

event.속성변수

 

event 종류
abort 이미지 로드 실패
blur 입력양식에 있던 커서가 빠져나감(예 : 검색창에 검색어를 치다가 검색버튼을 누름)
change 입력양식의 내용 변경(value 값 변경)
click 마우스 왼쪽버튼 클릭
dbclick 마우스 왼쪽버튼 더블클릭
dragdrop 마우스 드래그
error 에러 발생
focus 입력창양식에 없던 커서가 생겨남(예 : 네이버 들어가면 자동으로 검색창에 커서가 가 있음)
keydown 키보드 누름
keypress 키보드 누름
keyup 키보드에서 눌렀다가 손을 뗌
load 웹브라우저에서 html 문서가 읽혀짐
unload 웹브라우저에서 html 문서가 없어짐
mousedown 마우스 누름
mousemove 마우스 움직임
mouseout 마우스가 지정한 영역을 벗어남(왔다 땜)
mouseover 마우스가 지정한 영역에 들어옴(갖다댐)
mouseup 마우스를 누른 후 뗌
reset form 태그 내부의 입력양식을 초기화
즉, 체크는 풀고 키보드로 입력한 데이터는 지움
resize 화면의 크기를 변경
scroll 스크롤
select 입력양식의 내용 중 특정 내용을 선택
submit 서버로 폼의 데이터를 전송
기타 등등
event 객체의 속성변수
button 클릭한 마우스 버튼의 고유번호 저장
(왼쪽 : 1번, 오른쪽 : 2번, 가운데 : 3번)
keyCode 누른 키보드의 고유번호가 저장
clientX html 문서의 기준으로 이벤트가 발생한 X좌표 저장
clientY html 문서의 기준으로 이벤트가 발생한 Y좌표 저장
screenX 웹 화면을 기준으로 이벤트가 발생할 X좌표 저장
screenY 웹 화면을 기준으로 이벤트가 발생할 Y좌표 저장
altKey Alt 키의 누름 상태 여부가 true, false 값으로 저장
ctrlKey ctrl 키의 누름 상태 여부가 true, false 값으로 저장
shiftKey Shift 키의 누름 상태 여부가 true, false 값으로 저장
type 이벤트 종류 저장
기타 등등

 

<예제> 이벤트 객체를 이용해서 다음 화면을 만들고 기능을 구현하라.

-> 마우스 클릭 위치 : 마우스를 클릭하는 곳 좌표 출력

-> 클릭한 마우스 고유 번호 : 좌클릭, 우클릭, 가운데 클릭 시 고유번호 출력

-> 누른 키보드 번호 : 키보드 입력 시 고유번호 출력

<html>
 <head>
	<script>
    
    //-----------------------------
    //마우스 클릭 위치
    //----------------------------- 
	function show1(){
		//이벤트가 발생한 위치의 x 좌표를 구해 변수에 저장하기
		var x = event.screenX;

		//이벤트가 발생한 위치의 y 좌표를 구해 변수에 저장하기
		var y = event.screenY;

		//name="info1" 을 가진 입력양식의 value 속성에 클릭이 이벤트가 발생한 위치의 x좌표, y 좌표를 삽입
		document.myForm.info1.value = "x좌표 : " + x + ", " + "Y좌표 : " + y ;
	}
    
    //-----------------------------
    //마우스 고유번호
    //-----------------------------
    function show2(){
		document.myForm.info2.value = event.button;
	}
    
    //-----------------------------
    //누른 키보드 번호
    //-----------------------------  
    	function show3(){
		document.myForm.info3.value = event.keyCode;
	}
    </script>
</head>

입력을 위해 메모리 위치 주소값의 경로를 작성해준다.

x와 y의 경우 event 객체의 속성변수 screenX또는 screenY 안에 이벤트가 발생한 곳의 x,y 좌표가 저장되어있다.

<body
 onClick = "show1()"
 onMousedown = "show2()"
 onKeydown = "show3()" >


<form name="myForm">
	<table border=0 cellpadding=7 cellspacing=0>
		<tr>
			<td>마우스 클릭 위치 :
			<td>
			<input type="text" name="info1" size=30>
		<tr>
			<td>클릭한 마우스 고유번호 :
			<td>
				<input type="text" name="info2" size=30>
		<tr>
			<td>누른 키보드 번호 :
			<td>
				<input type="text" name="info3" size=30>
</form>
</body>
</html>

body 에서 가장 중요한 부분은 바디태그 시작 전 설정하는 event의 종류이다.

event 실행을 위해 on + 이벤트 로 실행 후, 속성변수에 들어간 설정을 실행해 준다.

반응형
LIST
반응형
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

+ Recent posts

반응형
LIST