[JavaScript] Event_실습

최은서·2023년 11월 9일

1) 성적 처리

[실습]
국어,영어,수학을 입력 받아서 총점, 평균을 구하여 출력
유효성 체크 :  성적 미입력시 --> '성적을 입력하세요', 0~100 범위를 벗어나면 -->  '0~100 입력 가능'
[출력 예시]
국어 : 99
영어 : 98
수학 : 97
총점 : 294
평균 : 229.333333333
<title>실습</title>
<script type="text/javascript">
window.onload=function(){
	//이벤트 연결
	document.getElementById('confirm_btn').onclick=function(){
		//유효성 체크(함수 만들어서 이용)
		let korean = document.getElementById('korean');
		if(!check(korean,'국어')){
			return;
		}
		let english = document.getElementById('english');
		if(!check(english,'영어')){
			return;
		}
		let math = document.getElementById('math');
		if(!check(math,'수학')){
			return;
		}
				
		//총점 구하기
		//input 태그에 명시한 데이터는 string으로 인식하기 때문에 명시적으로 형변환
		let sum = Number(korean.value) + Number(english.value) + Number(math.value);
		
		//평균 구하기
		let avg = sum / 3;
		
		//div에 출력
		let msg = '';
		msg += '국어 : ' + korean.value + '<br>';
		msg += '영어 : ' + english.value + '<br>';
		msg += '수학 : ' + math.value + '<br>';
		msg += '총점 : ' + sum + '<br>';
		msg += '평균 : ' + avg.toFixed(2); //소수점 둘째자리까지 표현
		
		document.getElementById('result').innerHTML = msg;
	};
	
	//유효성 체크 함수
	function check(course,name){
		//course : input 태그
		//name : 과목명
		if(course.value.trim()==''){ //입력을 안 했거나 공백만 입력한 경우 
			alert(name + ' 성적을 입력하세요!');
			course.value = ''; //공백이 있으면 제거
			course.focus();
			return false;
		}
		if(isNaN(course.value)){ //문자인지 숫자인지 체크
			//숫자가 아닌 경우
			alert(name + ' 성적은 숫자만 가능');
			course.value = '';
			course.focus();
			return false;
		}
		if(!Number.isInteger(Number(course.value))){ //정수인지 체크
			//정수가 아닌 경우
			alert('정수만 입력 가능');
			course.value = '';
			course.focus();
			return false;
		}
		if(course.value < 0 || course.value > 100){
			alert('0부터 100까지만 입력 가능');
			course.value = '';
			course.focus();
			return false;
		}
		return true;
	}
};
</script>
</head>
<body>
<form>
	국어 <input type="text" name="korean" id="korean"><br>
	영어 <input type="text" name="english" id="english"><br>
	수학 <input type="text" name="math" id="math"><br>
	<input type="button" value="확인" id="confirm_btn">
	<div id="result"></div>
</form>
</body>
</html>

2) 가위바위보 게임

<style type="text/css">
body{
	font-family:sans-serif;
}
h1{
	text-align:center;
}
div#game{
	width:480px;
	margin:0 auto;
	text-align:center;
}
div.result-img{
	position:relative;
	width:220px;
	float:left;
}
div.result-img:first-child{
	text-align:right;
}
div.result-img:last-child{
	text-align:left;
}
div.result-img span{
	font-size:20px;
	font-weight:bold;
	border-radius:20px;
	width:120px;
	text-align:center;
	background-color:#f4f2c6;
	position:absolute;
	top:25%;
	left:20%;
}
.user-option{
	cursor:pointer;
}
</style>
<script type="text/javascript">
window.onload=function(){
	//computer, user가 선택한 이미지(값)을 표시할 이미지
	let gameImage = document.querySelectorAll('.result-img img');
	
	let userOption = document.getElementsByClassName('user-option');
	//이벤트 연결
	for(let i=0;i<userOption.length;i++){
		userOption[i].onclick=function(){
			//computer가 선택한 값
			let com_answer = Math.floor(Math.random()*3); //0 가위, 1 바위, 2 보
			//computer가 선택한 이미지 표시하기
			gameImage[0].style.display = '';
			gameImage[0].src = '../files/timg' + com_answer + '.png';
			
			//user가 선택한 값
			let user_answer = this.id.substr(3); //이벤트가 발생한 태그
			//user가 선택한 이미지 표시하기
			gameImage[1].style.display = ''; //none을 지워줌
			gameImage[1].src = '../files/timg' + user_answer + '.png';
			
			//가위바위보 결과 표시하기
			/* 
			컴퓨터 사용자 컴-사		 결과
			 0	   0	0		  무
			 0	   1	-1		  패
			 0	   2	-2		  승
			 -----------------------
			 1	   0	1		  승
			 1	   1	0		  무
			 1	   2	-1		  패
			 -----------------------
			 2	   0	2		  패
			 2	   1	1		  승
			 2	   2	0		  무
			*/
			let result;
			let num = com_answer - user_answer; //승부의 결과 구하기
			if(num == 0){
						//컴퓨터,사용자
				result = ['무','무'];
			}else if(num == -2 || num == 1){
				result = ['승','패'];
			}else if(num == -1 || num == 2){
				result = ['패','승'];
			}
			
			let showResult = document.querySelectorAll('.result-img span');
			
			for(let i=0;i<showResult.length;i++){
				if(result[i] == '패'){
					gameImage[i].width = 100;
					showResult[i].style.display = 'none';
				}else{
					gameImage[i].width = 220;
					showResult[i].style.display = ''; //none을 지워줘서 보이게 만듦
				}
				showResult[i].innerHTML = (i == 0 ? '컴퓨터' : '사용자') + result[i]; //i가 0이면 컴퓨터, 아니면 사용자 출력
			}	
		};
	}
};
</script>
</head>
<body>
	<h1>가위바위보 게임</h1>
	<div id="game">
		<div>
			<img class="user-option" id="img0" src="../files/timg0.png" width="90">
			<img class="user-option" id="img1" src="../files/timg1.png" width="90">
			<img class="user-option" id="img2" src="../files/timg2.png" width="90">
		</div>
		<div>
			<div class="result-img"><img style="display:none;" alt="컴퓨터"><span></span></div>
			<div class="result-img"><img style="display:none;" alt="사용자"><span></span></div>
		</div>
	</div>
</body>
</html>

3) 상품 구매

<title>상품 구매</title>
<style type="text/css">
*{
	margin:0;
	padding:0;
}
h2{
	margin-top:40px;
	text-align:center;
}
table{
	margin:40px auto;
	width:600px;
}
td{
	padding-left:10px;
}
#buy{
	padding:10px 10px;
}
img{
	width:100px;
}
#price{
	text-align:center;
}
#preview{
	border:3px solid gray;
	margin:30px auto;
	text-align:center;
	height:50px;
}
input[type="submit"]{
	width:70px;
	height:30px;
	margin-left:500px;
	background-color:#289ca0;
	color:white;
	font-size:1.3em;
	font-weight:bold;
}
span{
	font-size:20px;
	font-weight:bold;
}
span#total{
	color:red;
}
tr#id{
	text-align:center;
}
</style>
<script type="text/javascript">
window.onload=function(){
	//상품 가격
	const product = {
		c0:200000,
		c1:100000,
		c2:50000,
		c3:150000,
		c4:100000
	};
	let sum = 0;
	let ship = 0;
	
	//const inputs = document.getElementsByName('goods');
	const inputs = document.querySelectorAll('input[type="checkbox"]');
	
	for(let i=0;i<inputs.length;i++){
		inputs[i].onclick=function(){
			if(this.checked){ //체크박스 선택시
				sum += product[this.id]; //상품 가격 누적
			}else{ //체크박스 해제시
				sum -= product[this.id]; //상품 가격 차감
			}
			
			//배송비 구하기
			if(sum > 0 && sum < 300000){
				ship = 5000;
			}else{
				ship = 0;
			}
			
			//구매 비용과 배송비를 화면에 표시
			const spans = document.getElementsByTagName('span');
			//총 상품가격
			spans[0].innerHTML = sum.toLocaleString();
			//배송비
			spans[1].innerHTML = ship.toLocaleString();
			//총 주문금액
			spans[2].innerHTML = (sum + ship).toLocaleString();
			
		};
	}
};
</script>
</head>
<body>
<!-- 
구매 물건 : 가방(20만원),코트(10만원),청바지(5만원),식사권(15만원),신발(10만원)
 -->
	<h2>상품 구매</h2>
	<form action="order.jsp" method="post">
	<table>
		<caption>구매 상품 목록</caption>
		<tr>
			<td><img src="../files/bag.jpg"></td>
			<td><img src="../files/coat.jpg"></td>
			<td><img src="../files/jeans.jpg"></td>
			<td><img src="../files/giftCard.jpg"></td>
			<td><img src="../files/shoes.jpg"></td>
		</tr>
		<tr>
			<td><input id="c0" type="checkbox" name="goods" value="bag"> bag</td>
			<td><input id="c1" type="checkbox" name="goods" value="coat"> coat</td>
			<td><input id="c2" type="checkbox" name="goods" value="jeans"> jeans</td>
			<td><input id="c3" type="checkbox" name="goods" value="giftcard"> gift card</td>
			<td><input id="c4" type="checkbox" name="goods" value="shoes"> shoes</td>
		</tr>
		<tr id="price">
			<td>(20만원)</td>
			<td>(10만원)</td>
			<td>( 5만원)</td>
			<td>(15만원)</td>
			<td>(10만원)</td>
		</tr>
		<tr height="100">
			<td colspan="5">*<b>30만원 미만 결제</b>시 5000원의 배송비가 추가됩니다.</td>
		</tr>
		<tr>
			<td id="preview" colspan="5">총 상품가격 <span>0</span> 원 + 
										총 배송비 <span>0</span> 원 = 
										총 주문금액 <span id="total">0</span></td>
		</tr>
		<tr>
			<td id="buy" colspan="5">
				<input type="submit" value="buy">
			</td>
		</tr>
	</table>
	</form>
</body>
</html>

4) TodoList

<title>할 일 목록(TodoList)</title>
<link rel="stylesheet" href="https:unpkg.com/bootstrap@5.2.3/dist/css/bootstrap.min.css">
<style type="text/css">
body{
	margin:0;
	padding:0;
	font-family:sans-serif;
}
.title{
	text-align:center;
	font-weight:bold;
	font-size:20pt;
}
.todo-done{
	text-decoration:line-through;
}
.container{
	padding:10px;
}
.pointer{
	cursor:pointer;
}
</style>
</head>
<body>
<div class="container">
	<div class="card card-body bg-light">
		<div class="title">할 일 목록(TodoList)</div>
	</div>
	<div class="card card-default">
		<div class="card-body">
			<div class="ol">
				<div class="input-group">
					<input type="text" class="form-control" name="msg" placeholder="할 일을 여기에 입력!" id="todo">
					<span class="btn btn-primary input-group-addon" id="add_btn">추가</span>
				</div>
			</div>
		</div>
		<div class="row">
			<div class="col">
				<ul class="list-group" id="list"></ul>
			</div>
		</div>
	</div>
</div>
<script type="text/javascript">
	let ts = new Date().getTime(); //유일한 식별값을 사용하기 위해서 숫자로 된 날짜값 활용
	//초기 데이터 배열 생성
	const todoList = [
		{id:ts,todo:"도서관에서 책 대여하기",completed:true},
		{id:ts+1,todo:"영화 보기",completed:false},
		{id:ts+2,todo:"저녁 장보기",completed:false},
		{id:ts+3,todo:"운동하기",completed:false}
	];
	
	//목록 처리
	function selectList(){
		//목록을 표시하기 위해 ul을 호출
		let listGroup = document.getElementById('list');
		listGroup.innerHTML = ''; //초기화
		
		//목록 표시
		todoList.forEach(function(element,index,array){
			let output = '';
			if(element.completed){ //할 일 체크가 true
				output += '<li class="list-group-item list-group-item-success">';
				output += '<span class="pointer todo-done check-btn" id="' + element.id + '">' + element.todo + '(완료)</span>';
			}else{ //할 일 체크가 false
				output += '<li class="list-group-item">';
				output += '<span class="pointer check-btn" id="' + element.id + '">' + element.todo + '</span>';
			}
			output += '<span class="float-end badge bg-secondary pointer delete-btn" id="' + element.id + '">삭제</span>';
			output += '</li>';
			listGroup.innerHTML += output;
		});
		
		//삭제 이벤트 연결
		let delete_btn = document.getElementsByClassName('delete-btn');
		for(let i=0;i<delete_btn.length;i++){
			delete_btn[i].onclick=function(){
				//이벤트가 발생한 태그의 id 반환
				let id = this.id;
				//삭제하고자 하는 아이템의 id가 있는 todoList 배열의 객체 구하고
				//해당 객체의 배열의 인덱스 반환
				let index = todoList.findIndex((item)=> id == item.id);
				//해당 객체 삭제
				todoList.splice(index,1);
				selectList(); //배열에서 객체가 삭제되었기 때문에 목록을 새로 호출
			};
		} //end of for
		
		//할 일 체크 이벤트 연결
		let check_btn = document.getElementsByClassName('check-btn');
		for(let i=0;i<check_btn.length;i++){
			check_btn[i].onclick=function(){
				//이벤트가 발생한 태그의 id 반환
				let id = this.id;
				//삭제하고자 하는 아이템의 id가 있는 todoList 배열의 객체 구하고
				//해당 객체의 배열의 인덱스 반환
				let index = todoList.findIndex((item)=> id == item.id);
				//할 일 체크가 true --> false, false --> true로 변경
				todoList[index].completed = !todoList[index].completed;
				selectList(); //체크 또는 체크를 해제했기 때문에 목록을 새로 호출
			};
		} //end of for
		
	} //end of selectList
	
	//초기 데이터 설정
	selectList();
	
	let todo = document.getElementById('todo');
	//엔터 키 이벤트 연결
	todo.onkeydown=function(event){
		if(event.keyCode == 13){
			addTodo();
		}
	}
	
	//추가 버튼 이벤트 연결
	let add_btn = document.getElementById('add_btn');
	add_btn.onclick=function(){
		addTodo();
	};
	
	//등록 처리 함수
	function addTodo(){
		if(todo.value==''){
			alert('할 일을 입력하세요!');
			todo.focus();
			return;
		}
		//배열의 맨 뒤에 객체 추가
		//todoList.push({id:new Date().getTime(),todo:todo.value,completed:false});
		//배열의 맨 앞에 객체 추가
		todoList.unshift({id:new Date().getTime(),todo:todo.value,completed:false});
		todo.value = ''; //초기화
		
		selectList(); //새로 등록된 데이터를 표시하기 위해 목록을 다시 호출
	}
	
</script>
</body>
</html>

0개의 댓글