JAVA SCRIPT
계산기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>간이계산기</title>
<script>
function calculate(op) {
// op에는 +, -, *, /, % 중 전달되서 옴
// input에 입력된 값을 얻어와 number 타입으로 변환
const num1 = Number( document.getElementById("num1").value );
const num2 = Number( document.getElementById("num2").value );
// 결과 저장용 변수
let res = 0;
if(op == "+") {
res = num1 + num2;
} else if(op == "-") {
res = num1 - num2;
} else if(op == "*") {
res = num1 * num2;
} else if(op == "/") {
res = num1 / num2;
} else {
res = num1 % num2;
}
// switch(op) {
// case '+' : res = num1 + num2; break;
// case '-' : res = num1 - num2; break;
// case '*' : res = num1 * num2; break;
// case '/' : res = num1 / num2; break;
// case '%' : res = num1 % num2; break;
// }
// span 태그에 결과 출력
document.getElementById("result").innerText = res;
}
</script>
</head>
<body>
<h1>간이계산기 만들기</h1>
첫번째 값 : <input id="num1"><br>
두번째 값 : <input id="num2"><br>
<button onclick="calculate('+')">+</button>
<button onclick="calculate('-')">-</button>
<button onclick="calculate('*')">*</button>
<button onclick="calculate('/')">/</button>
<button onclick="calculate('%')">%</button>
<br><br>
계산 결과 : <span id="result"></span>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>간이계산기2</title>
<script>
function calculate(btn) {
// btn에는 this(클릭된 버튼 요소)가 전달되어짐
console.log(btn);
const op = btn.innerText; // 버튼의 내용(+,-,*,/,%)을 얻어옴
// input에 입력된 값을 얻어와 number 타입으로 변환
const num1 = Number( document.getElementById("num1").value );
const num2 = Number( document.getElementById("num2").value );
// 결과 저장용 변수
// let res = 0;
// if(op == "+") {
// res = num1 + num2;
// } else if(op == "-") {
// res = num1 - num2;
// } else if(op == "*") {
// res = num1 * num2;
// } else if(op == "/") {
// res = num1 / num2;
// } else {
// res = num1 % num2;
// }
switch(op) {
case '+' : res = num1 + num2; break;
case '-' : res = num1 - num2; break;
case '*' : res = num1 * num2; break;
case '/' : res = num1 / num2; break;
case '%' : res = num1 % num2; break;
}
// span 태그에 결과 출력
document.getElementById("result").innerText = res;
}
</script>
</head>
<body>
<h1>간이계산기 만들기</h1>
첫번째 값 : <input id="num1"><br>
두번째 값 : <input id="num2"><br>
<button onclick="calculate(this)">+</button>
<button onclick="calculate(this)">-</button>
<button onclick="calculate(this)">*</button>
<button onclick="calculate(this)">/</button>
<button onclick="calculate(this)">%</button>
<!-- 함수 호출 시 매개변수 this
이벤트가 발생한 요소 자체를 의미한다.
(여기서는 클릭된 연산자 버튼)
-->
<br><br>
계산 결과 : <span id="result"></span>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>간이계산기3</title>
<script>
function calculate(btn) {
// btn에는 this(클릭된 버튼 요소)가 전달되어짐
console.log(btn);
const op = btn.innerText; // 버튼의 내용(+,-,*,/,%)을 얻어옴
// input에 입력된 값을 얻어와 number 타입으로 변환
const num1 = Number( document.getElementById("num1").value );
const num2 = Number( document.getElementById("num2").value );
// eval("코드 형식 문자열")
// -> 작성된 문자열을 JS 코드로 해석하는 함수
// EX) 10 + '+' + 20 -> 10 + 20
// -> 속도 + 보안 이슈가 있어서 사용 지양
// -> 해결방법 : new Function() 사용
document.getElementById("result").innerText = new Function("return " + num1 + op + num2)();
// 실행까지 하려면 소괄호까지 붙여줘야 함
}
</script>
</head>
<body>
<h1>간이계산기 만들기</h1>
첫번째 값 : <input id="num1"><br>
두번째 값 : <input id="num2"><br>
<button onclick="calculate(this)">+</button>
<button onclick="calculate(this)">-</button>
<button onclick="calculate(this)">*</button>
<button onclick="calculate(this)">/</button>
<button onclick="calculate(this)">%</button>
<!-- 함수 호출 시 매개변수 this
이벤트가 발생한 요소 자체를 의미한다.
(여기서는 클릭된 연산자 버튼)
-->
<br><br>
계산 결과 : <span id="result"></span>
</body>
</html>
[결과]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>06_이벤트</title>
<!-- <script src="js/06_이벤트.js"></script> -->
<!-- script가 위에 있을 경우 고전 이벤트 모델 오류 발생! -->
<style>
#test3 {
width: 200px;
height: 200px;
border: 1px solid black;
background-color: pink;
cursor: pointer;
}
/* 복습문제 */
#div1 {
width: 100px;
height: 100px;
border: 1px solid black;
}
</style>
</head>
<body>
<h1>이벤트(Event)</h1>
<pre>
이벤트(Event): 동작, 행위
-> 브라우저에서의 동작, 행위 : click, keyup, keydown, mouseover, drag, change, submit...
https://www.w3schools.com/jsref/dom_obj_event.asp
이벤트 리스너(Event Listener)
-> 이벤트가 발생하는 것을 대기하고 있다가
이벤트가 발생하는 것이 감지되면 연결된 기능(함수)를 수행하는것
ex) onclick, onkeyup, onchange, onsubmit ... (on 이벤트명)
이벤트 핸들러(Event Handler)
-> 이벤트 리스너에 연결된 기능으로
이벤트 발생 시 수행하고자 하는 내용을 작성해둔 함수
<!-- ex) <button onclick = "readValue()"></button> -->
<!-- 이벤트리스너 이벤트핸들러 -->
</pre>
<hr>
<h3>인라인 이벤트 모델</h3>
<pre>
요소 내부에 이벤트를 작성하는 방법으로
on이벤트명 = 함수명() 형태로 작성함.
</pre>
<button onclick="test1(this)">인라인 이벤트 모델 확인</button>
<hr>
<h3>고전 이벤트 모델</h3>
<pre>
요소가 가지고 있는 이벤트 속성(이벤트 리스너)에
이벤트 핸들러를 연결하는 방법으로
인라인 모델처럼 HTML 요소에 JS 코드를 포함되는 것이 아닌
script에만 이벤트 관련 코드를 작성할 수 있다.
</pre>
<button id="test2-1">고전 이벤트 모델 확인</button>
<button id="test2-2">고전 이벤트 모델 제거</button>
<button id="test2-3">고전 이벤트 모델 단점</button>
<hr>
<h3>표준 이벤트 모델(addEventListener)</h3>
<pre>
- W3C (HTML, CSS, JS 웹표준 지정 단체)에서
공식적으로 지정한 이벤트 모델(이벤트 동작 지정 방법)
- 한 요소에 여러 이벤트 핸들러를 설정할 수 있다.
-> 고전 이벤트 모델 단점 보완
</pre>
<div id="test3">클릭하면 크기가 늘어나요!</div>
<hr>
<h3>이벤트 복습 문제</h3>
색상을 영어로 입력한 후 변경 버튼을 클릭하면 #div1 의 배경색이 변경되도록 하시오.
<div id="div1"></div>
<input id="input1">
<button id="changeBtn1">변경</button>
<hr>
<h1>HTML 요소 기본 이벤트 제거</h1>
<h3>a태그 기본 이벤트 제거</h3>
<a id="moveNaver" href="https://www.naver.com">네이버로 이동</a>
<script src="js/06_이벤트.js"></script>
</body>
</html>
// 인라인 이벤트 모델 확인하기
function test1(btn) {
console.log(btn);
btn.style.backgroundColor = "black";
btn.style.color = "white";
}
// 고전 이벤트 모델 확인하기
// ** 주의사항 **
// 고전/표준 이벤트 모델은 랜더링된 HTML 요소에
// 이벤트에 관련된 동작을 부여하는 코드
// -> 랜더링이 되지 않은 요소에는 관련 동작을 추가할 수 없다!!
// (문제 원인 : HTML 코드 해석 순서 (위->아래))
// 해결방법 : HTML 요소가 먼저 랜더링 된 후 JS 코드 수행할 수 있도록
// body 태그 맨 아래 script 태그를 넣는다
document.getElementById("test2-1").onclick = function() {
// 익명함수(이벤트 핸들러에 많이 사용함)
alert("고전 이벤트 모델로 출력된 대화상자");
}
// 이벤트 제거 (인라인 이벤트 모델은 제거 불가능)
document.getElementById("test2-2").onclick = function() {
document.getElementById("test2-1").onclick = null;
}
// 고전 이벤트 모델 단점
// -> 한 요소에 동일한 이벤트 리스너(onclick)에 대한
// 다수의 이벤트 핸들러(배경색 변경, 폰트크기 변경)를 작성할 수 없다.
// (마지막으로 해석된 이벤트 핸들러만 적용)
document.getElementById("test2-3").onclick = function(event) {
// 버튼 색 바꾸기 (모든 방법에서 가능한 방법!)
// 방법 1) 요소를 문서에서 찾아서 선택
// document.getElementById("test2-3").style.backgroundColor = "pink";
// 방법 2) 매개변수 e 또는 event 활용하기
// -> 이벤트 핸들러에 e 또는 event를 작성하는 경우
// 해당 이벤트와 관련된 모든 정보가 담긴 이벤트 객체가 반환된다.
console.log(event);
// event.target : 이벤트가 발생한 요소
// event.target.style.backgroundColor = "pink";
// 방법 3) this 활용하기 -> 이벤트가 발생한 요소
this.style.backgroundColor = "pink";
}
document.getElementById("test2-3").onclick = function() {
this.style.fontSize = "30px";
}
// 표준 이벤트 모델
/*
요소.addEventListener("click", function() {})
*/
document.getElementById("test3").addEventListener("click", function() {
console.log(this.clientWidth); // 현재 요소의 너비(테두리 제외) // 200
this.style.width = this.clientWidth + 20 + "px";
});
// test3에 이미 click 이벤트에 대한 동작이 존재하는데,
// 중복해서 적용 (고전 이벤트 모델 문제점 해결 확인)
document.getElementById("test3").addEventListener("click", function() {
this.style.height = this.clientHeight + 20 + "px";
});
// 복습문제
// 내풀이
// document.getElementById("changeBtn1").addEventListener("click", function() {
// const input = document.getElementById("input1").value;
// if(input == 'red') {
// document.getElementById("div1").style.backgroundColor = 'red';
// } else if(input == 'yellow') {
// document.getElementById("div1").style.backgroundColor = 'yellow';
// } else if(input == 'pink') {
// document.getElementById("div1").style.backgroundColor = 'pink';
// }
// if(input == "") {
// alert("색상을 영어로 입력해주세요");
// }
// });
// 강사님 풀이
document.getElementById("changeBtn1").addEventListener("click", function(){
const div1 = document.getElementById("div1");
const input1 = document.getElementById("input1");
// input1에 작성된 값 얻어오기
const bgColor = input1.value;
// div1 배경색 변경
div1.style.backgroundColor = bgColor;
});
// input1에 작성한 값이 변경되었을 때 입력된 값으로 배경색 변경
document.getElementById("input1").addEventListener("change", function() {
// change 이벤트
// - text관련 input태그는
// 입력된 값이 변할 때를 change라고 하지 않고
// 입력이 완료된후 포커스를 잃거나, 엔터를 입력하는 경우
// 입력된 값이 '이전값과 다를' 경우에 change 이벤트가 발생한걸로 인식.
console.log("change 이벤트 발생");
const div1 = document.getElementById("div1");
const input1 = document.getElementById("input1");
// input1에 작성된 값 얻어오기
const bgColor = input1.value;
// div1 배경색 변경
div1.style.backgroundColor = bgColor;
});
// a태그 기본 이벤트 제거
document.getElementById("moveNaver").addEventListener("click", function(e) {
// 매개변수 e 또는 event == 이벤트 발생 객체
// 이벤트와 관련된 정보가 담겨있는 객체
e.preventDefault(); // HTML 요소가 가지고있는 기본 이벤트를 막음(제거) // 자주 사용!
});
고전 이벤트 모델 확인 버튼 클릭 시,
고전 이벤트 모델 제거 버튼 클릭 후 +
고전 이벤트 모델 확인 버튼 클릭 시 아무 효과 없음.
고전 이벤트 모델 단점 버튼 클릭 시, 글자 크기 커짐.
네이버로 이동 클릭해도 네이버로 이동하지 않음.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>07_정규표현식</title>
<style>
.area {
width: 500px;
min-height: 300px;
/* 최소 높이 300 넘어가면 자동으로 증가 */
border: 1px solid black;
}
.confirm { color: green; }
.error { color: red; }
</style>
</head>
<body>
<h1>정규표현식(Regular Expression)</h1>
<pre>
특정한 규칙을 가진 문자열 집합을 표현하는데 사용하는 형식 언어.
정규표현식을 이용하면
입력된 문자열에 대한 특정 조건 검색, 일치 여부 판단, 치환에 대한
조건문을 간단히 처리할 수 있다.
</pre>
<h3>정규 표현식 참고 사이트</h3>
<!-- 잘 사용하지 않음 -->
<a href="https://regexper.com" target="_blank">작성한 정규표현식을 그림으로 나타내주는 사이트</a>
<!-- 유용! -->
<a href="https://regexr.com" target="_blank">정규표현식 테스트 사이트</a>
<hr>
<h1>정규 표현식 객체 생성 및 확인하기</h1>
<pre>
1. 정규 표현식 객체 생성 방법
1) const regExp = new RegExp("정규표현식");
2) const regExp = /정규표현식/;
-> 양쪽 '/' 기호 정규 표현식의 리터럴 표기법
2. 문자열 패턴 확인 메서드(함수)
1) regExp.test(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우 true, 없으면 false
2) regExp.exec(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우
처음 매칭되는 문자열을 반환
없으면 null 반환
</pre>
<button id="check1">확인하기</button>
<hr>
<h1>정규표현식의 메타 문자</h1>
<pre>
문자열의 패턴을 나타내는 문자.
문자마다 지정된 특별한 뜻이 담겨있다.
a (일반문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
[abcd] : 문자열 내에 a,b,c,d 중 하나라도 일치하는 문자가 있는지 검색
^ (캐럿) : 문자열의 시작을 의미
$ (달러) : 문자열의 끝을 의미
\w (단어) : 아무 글자(단, 띄어쓰기, 특수문자, 한글 X)
\d (숫자) : 아무 숫자 (0~9 중 하나)
\s (공간) : 아무 공백 문자(띄어쓰기, 엔터, 탭 등)
[0-9] : 0부터 9까지 모든 숫자
[ㄱ-힣] : ㄱ부터 힣 까지 모든 한글
[a-z] : 모든 영어 소문자
[A-Z] : 모든 영어 대문자
* 특수문자의 경우 각각을 입력하는 방법밖엔 없음
* 수량 관련 메타 문자
a{5} : a문자가 5개 존재
a{2, 5} : a가 2개 이상 5개 이하
a{2,} : a가 2개 이상
a{,5} : a가 5개 이하
* : 0개 이상
+ : 1개 이상
? : 0개 또는 1개
. : 1칸 (개행문자를 제외한 문자 하나)
\*, \+, \?, \.
</pre>
<button id="btn1">확인하기</button>
<div id="div1" class="area"></div>
<hr>
<h3>이름 유효성 검사</h3>
<h5>한글 2~5글자</h5>
이름 : <input type="text" id="inputName"> <br>
<span id="inputNameResult"></span>
<hr>
<h3>주민등록번호 유효성검사</h3>
주민등록번호 : <input id="inputPno"> <br>
<span id="inputPnoResult"></span>
<script src="js/07_정규표현식.js"></script>
</body>
</html>
// 정규 표현식 객체 생성 + 확인하기
document.getElementById("check1").addEventListener("click", function() {
// 정규표현식 객체 생성
const regExp1 = new RegExp("script");
// "script"와 일치하는 문자열이 있는지 검사하는 정규표현식
const regExp2 = /java/;
// "java"와 일치하는 문자열이 있는지 검사하는 정규표현식
// 확인하기
const str1 = "저희는 지금 javascript를 공부하고 있습니다.";
const str2 = "servlet/jsp(java server page)도 조만간 할겁니다";
const str3 = "java, java, java";
console.log( "regExp1.test(str1) : " + regExp1.test(str1) ); // regEx1.test(str1) : true
console.log( regExp1.exec(str1) );
console.log( "regExp2.test(str2) : " + regExp2.test(str2) ); // regExp2.test(str2) : true
console.log( regExp2.exec(str2) );
// 일치하는게 없는 경우
console.log( "regExp1.test(str2) : " + regExp1.test(str2) ); // regExp1.test(str2) : false
console.log( regExp1.exec(str2) );
// 일치하는게 여러개 있을 경우
console.log( "regExp2.test(str3) : " + regExp2.test(str3) ); // regExp2.test(str3) : true
console.log( regExp2.exec(str3) );
});
// 메타문자 확인하기
document.getElementById("btn1").addEventListener("click", function() {
const div1 = document.getElementById("div1");
// a (일반문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
const regExp1 = /a/;
div1.innerHTML += "/a/, apple : " + regExp1.test("apple") + "<hr>"; // true
div1.innerHTML += "/a/, price : " + regExp1.test("price") + "<hr>"; // false
// [abcd] : 문자열 내에 a,b,c,d 중 하나라도 일치하는 문자가 있는지 검색
const regExp2 = /[a,b,c,d]/;
div1.innerHTML += "/[a,b,c,d]/, apple : " + regExp2.test("apple") + "<hr>"; // true
div1.innerHTML += "/[a,b,c,d]/, ssbss : " + regExp2.test("ssbss") + "<hr>"; // true
div1.innerHTML += "/[a,b,c,d]/, qwerty : " + regExp2.test("qwerty") + "<hr>"; // false
// ^ (캐럿) : 문자열의 시작을 의미
const regExp3 = /^group/; // 문자열의 시작이 group인지 확인
div1.innerHTML += "/^group/, group100 : " + regExp3.test("group100") + "<hr>"; // true
div1.innerHTML += "/^group/, 100group : " + regExp3.test("100group") + "<hr>"; // false
// $ (달러) : 문자열의 끝을 의미
const regExp4 = /group$/; // 문자열의 끝이 group인지 확인
div1.innerHTML += "/^group/, group100 : " + regExp4.test("group100") + "<hr>"; // false
div1.innerHTML += "/^group/, 100group : " + regExp4.test("100group") + "<hr>"; // true
});
// 이름 유효성 검사
document.getElementById("inputName").addEventListener("keyup", function() {
// 결과 출력용 span
const span = document.getElementById("inputNameResult");
// 한글 2~5글자 정규 표현식
const regExp = /^[가-힣]{2,5}$/;
// 빈칸인지검사
if(this.value == 0) {
span.innerText = "";
return;
}
// 유효성 검사
if ( regExp.test(this.value) ) {
// 유효한 경우
span.innerText = "유효한 이름 형식입니다";
span.style.color = "green";
span.style.fontWeight = "bold";
} else {
span.innerText = "이름 형식이 유효하지 않습니다";
span.style.color = "red";
span.style.fontWeight = "bold";
}
});
// 주민등록번호 정규식 검사
document.getElementById("inputPno").addEventListener("keyup", function() {
const span = document.getElementById("inputPnoResult");
if(this.value.length == 0) {
span.innerText = "주민등록번호를 작성해주세요";
span.classList.remove("confirm");
span.classList.remove("error");
return;
}
// 생년월일(6)-고유번호(7)
const regExp = /^\d{6}\-\d{7}$/;
if(regExp.test(this.value)) {
span.innerText = "유효한 주민등록번호 형식입니다."
span.classList.remove("error");
span.classList.add("confirm");
} else {
span.innerText = "유효하지 않습니다."
span.classList.remove("confirm");
span.classList.add.apply("error");
}
});
회원가입 양식
<!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>회원 가입 양식_teacher</title>
<style>
.btn-area{ text-align: right; }
td{ padding: 5px; }
fieldset{ width: 430px;}
span{font-size: 14px;}
.confirm{ color : green; }
.error{ color : red; }
</style>
</head>
<body>
<form action="main.html" method="post" onsubmit="return validate()">
<fieldset>
<legend>회원 가입 양식</legend>
<table>
<tr>
<td>아이디</td>
<td>
<input type="text" id="inputId">
</td>
<td>
<button type="button">중복확인</button>
</td>
</tr>
<tr>
<td>비밀번호</td>
<td>
<input type="password" id="inputPw">
</td>
<td>
<span id="pwMessage"></span>
</td>
</tr>
<tr>
<td>비밀번호확인</td>
<td>
<input type="password" id="inputPwConfirm">
</td>
<td></td>
</tr>
<tr>
<td>이름</td>
<td>
<input type="text" id="inputName">
</td>
<td>
<span id="nameMessage"></span>
</td>
</tr>
<tr>
<td>성별</td>
<td>
<label> 남 <input type="radio" name="gender" value="m"></label>
<label> 여 <input type="radio" name="gender" value="f"></label>
</td>
<td></td>
</tr>
<tr>
<td>전화번호</td>
<td>
<input type="text" id="inputTel">
</td>
<td></td>
</tr>
<tr>
<td>이메일</td>
<td>
<input type="text" id="inputEmail">
</td>
<td></td>
</tr>
<tr>
<td></td>
<td class="btn-area">
<button type="reset">초기화</button>
<button>회원가입</button>
</td>
<td></td>
</tr>
</table>
</fieldset>
</form>
<script src="js/회원가입양식_teacher.js"></script>
</body>
</html>
// 유효성 검사 객체
const checkObj = {
"inputId" : false, // 아이디
"inputPw" : false, // 비밀번호
"inputPwConfirm" : false, // 비번확인
"inputName" : false, // 이름
"gender" : false, // 성별
"inputTel" : false // 전화번호
}
/** 아이디 : 값이 변했을 때
* 영어 소문자로 시작하고,
영어 대/소문자, 숫자, -, _로만 이루어진 6~14 글자 사이 문자열인지 검사
아이디 정규표현식 : (각자 작성)
- 형식이 일치할 경우
입력창의 배경색을 springgreen 으로 변경 */
document.getElementById("inputId").addEventListener("change", function() {
const regExp = /^[a-z][\w-_]{5,13}$/;
// 소문자시작(1) + 나머지(5~13) = 6~14글자
if(regExp.test(this.value)) {
this.style.backgroundColor = "springgreen";
this.style.color = "black";
checkObj.inputId = true;
} else {
this.style.backgroundColor = "red";
this.style.color = "white";
checkObj.inputId = "fasle";
}
});
/***
* 비밀번호, 비밀번호 확인 : 키보드가 올라올 때
"비밀번호" 를 미입력한 상태에서 "비밀번호 확인"을 작성할 경우
"비밀번호 확인"에 작성된 내용을 모두 삭제하고
'비밀번호를 입력해주세요' 경고창 출력 후
focus 를 "비밀번호" 입력창으로 이동 */
const inputPw = document.getElementById("inputPw");
const inputPwConfirm = document.getElementById("inputPwConfirm");
inputPwConfirm.addEventListener("keyup", function() {
if(inputPw.value.length == 0) {
this.value = "";
alert("비밀번호를 입력해주세요");
inputPw.focus();
checkObj.inputPw = false;
}
});
/**
* - 비밀번호가 일치할 경우
"비밀번호" 입력창 오른쪽에 "비밀번호 일치" 글자를 초록색으로 출력.
*
- 비밀번호가 일치하지 않을 경우
"비밀번호" 입력창 오른쪽에 "비밀번호가 불일치" 글자를 빨간색으로 출력.
*/
const pwMessage = document.getElementById("pwMessage");
inputPw.addEventListener("keyup", function() {
if( (inputPw.value == inputPwConfirm.value) && inputPw.value.length != 0 ) {
pwMessage.innerText = "비밀번호 일치";
pwMessage.classList.add("confirm");
pwMessage.classList.remove("error");
checkObj.inputPw = true;
checkObj.inputPwConfirm = true;
} else {
pwMessage.innerText = "비밀번호 불일치";
pwMessage.classList.add("error");
pwMessage.classList.remove("confirm");
checkObj.inputPwConfirm = false;
}
});
inputPwConfirm.addEventListener("keyup", function() {
if( (inputPw.value == inputPwConfirm.value) && inputPw.value.length != 0 ) {
pwMessage.innerText = "비밀번호 일치";
pwMessage.classList.add("confirm");
pwMessage.classList.remove("error");
checkObj.inputPw = true;
checkObj.inputPwConfirm = true;
} else {
pwMessage.innerText = "비밀번호 불일치";
pwMessage.classList.add("error");
pwMessage.classList.remove("confirm");
checkObj.inputPwConfirm = false;
}
});
/*
* 이름 : 값이 변화했을 때
한글 2~5 글자 사이 문자열인지 검사.
이름 정규표현식 : /^[가-힣]{2,5}$/
- 형식이 일치할 경우
"이름" 입력창 오른쪽에 "정상입력" 글자를 초록색으로 출력.
- 형식이 일치하지 않을 경우
"이름" 입력창 오른쪽에 "한글만 입력하세요" 글자를 빨간색으로 출력.
*/
document.getElementById("inputName").addEventListener("change", function() {
const regExp = /^[가-힣]{2,5}$/;
const nameMessage = document.getElementById("nameMessage");
if(regExp.test(this.value)) {
nameMessage.innerText = "정상입력";
nameMessage.classList.add("confirm");
nameMessage.classList.remove("error");
checkObj.inputName = true;
} else {
nameMessage.innerText = "한글만 입력하세요";
nameMessage.classList.add("error");
nameMessage.classList.remove("confirm");
checkObj.inputName = false;
}
});
/*
회원가입 버튼 클릭 시 : validate() 함수를 호출하여
성별이 선택 되었는지, 전화번호가 형식에 알맞게 작성되었는지 검사 */
function validate() {
/*
- 성별이 선택되지 않은 경우
"성별을 선택해주세요." 경고창(=대화상자) 출력 후
submit 기본 이벤트를 제거하여 회원가입이 진행되지 않게 함.
*/
const gender = document.getElementsByName("gender");
if(!gender[0].checked && !gender[1].checked) {
alert("성별을 선택해주세요.");
checkObj.gender = false;
return false;
} else {
checkObj.gender = true;
}
/*전화번호 정규 표현식 : /^[0][0-9]{1,2}-[0-9]{3,4}-[0-9]{4}/
- 전화번호 형식이 올바르지 않을 경우
"전화번호의 형식이 올바르지 않습니다" 경고창(==대화상자) 출력 후
submit 기본 이벤트를 제거하여 회원가입이 진행되지 않게 함. */
const inputTel = document.getElementById("inputTel");
const regExp = /^[0][0-9]{1,2}-[0-9]{3,4}-[0-9]{4}/;
if(!regExp.test(inputTel.value)) {
alert("전화번호의 형식이 올바르지 않습니다.");
checkObj.inputTel = false;
return false;
} else {
checkObj.inputTel = true;
}
// checkObj가 전부 true일때 == 모든 유효성검사를 통과했을 때 ==> 회원가입
for(let key in checkObj) {
if ( !checkObj[key] ) { // 1) checkObj["inputTel"] ==> false
return false;
}
}
alert("회원가입 완료");
return true;
}
[ 결과 ]
참고할만한 사이트
W3Schools : https://www.w3schools.com/jsref/dom_obj_event.asp
( JS 이벤트 객체 확인해볼 수 있는 사이트 )