JavaScript

자바스크립트 이벤트(javascript event)

걷는 청년 2024. 7. 24. 11:58

자바 스크립트에는 사용자가 이벤트를 발생시키면 그 이벤트에 대응하여 이벤트 핸들러를 사용해서 처리해주어야 한다.

그에 대한 실습을 해보았다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function func(){
	console.log('good');
	let dateTime = "2024-05-20";
	let arrData = dateTime.split('-');
	
	document.write(`${arrData[0]}년 ${arrData[1]}월 ${arrData[2]}일`);
	
}

</script>

</head>
<body>
<h2>이벤트 처리 이해</h2>
<a href="https://www.naver.com">네이버</a><br>
<a href="javascript:func()">이벤트 처리 함수 호출1</a><br>

<!-- 
이벤트 연결
사용자가 실제 이벤트를 발생시켰을 때 그 이벤트에 대응하여 처리하는 것을 이벤트 핸들러라고 함
이벤트 핸들러는 앞에 'on'을 붙여 주고 이벤트에 대한 동작(함수)을 처리.
on 이벤트 종류 = 핸들러 함수()
 -->

<a href="javascript:onclick='func()';">이벤트 처리 함수 호출2</a><br>

<button onclick="func()">이벤트 처리 함수 호출3</button><br>

<input type="button" onclick="func()" value="이벤트 처리 함수 호출4"/>

</body>
</html>

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

function colorFunc(){
	//alert(document.frm.selBc.value);
	
	document.body.bgColor = document.frm.selBc.value;
	document.body.text = frm.selTc.value;
	
}

</script>

</head>
<body>
<h2>이벤트 연습</h2>
<form name="frm">

<table border="1">
	<tr>
		<td colspan="2">색상 선택</td>
	</tr>
	<tr>
		<td><b>배경색 : </b></td>
		<td>
			<select name="selBc">
				<option value="black">검정</option>
				<option value="blue">파랑</option>
				<option value="green">초록</option>
				<option value="white" selected="selected">하양</option>
			</select>
		</td>
	</tr>
	<tr>
		<td><b>글자색 : </b></td>
		<td>
			<select name="selTc">
				<option value="black" selected="selected">검정</option>
				<option value="blue">파랑</option>
				<option value="green">초록</option>
				<option value="white">하양</option>
			</select>
		</td>
	</tr>
	<tr>
		<td colspan="2" style="text-align: center;">
			<input type="button" value="변경 확인" onclick="colorFunc()"/>
		</td>
	</tr>
	
</table>

</form>

</body>
</html>

 

 

이벤트를 처리하면서 DOM을 배우기 전 중요한 두가지에 대해서도 따로 공부해보았다.

 

innerText : element 안의 text 값들만을 수정, 참조. tag도 text 처리
innerHTML : element 안의 HTML이나 XML이 있으면 기능 발휘

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function func1(){
	let str1 = document.getElementById("test1").innerHTML;
	document.getElementById("show1").innerHTML = str1;
	document.getElementById("show2").innerHTML = "<i>" + str1 + "</i>";
	
	let mytag = "이름:<input type='text' name='irum'/>";
	mytag += "<br>";
	mytag += "나이:<input type='text' name='nai' value='23'/>";
	document.getElementById("test1").innerHTML = mytag;
}

function func2(){
	let str2 = document.getElementById("test2").innerHTML;
	document.getElementById("show1").innerText = str2;
	document.getElementById("show2").innerText = "<i>" + str2 + "</i>";
}

</script>
</head>
<body>
<h2>실행 중 tag 또는 데이터의 생성, 삭제, 수정, 참조, 처리 가능</h2>
<!-- 
innerText : element 안의 text 값들만을 수정, 참조. tag도 text 처리
innerHTML : element 안의 HTML이나 XML이 있으면 기능 발휘
DOM 기능을 일부 수행
Document Object Model의 약자로, HTML 요소를 자바스크립트 object처럼 조작할 수 있는 모델
 -->
<hr>
<div id="test1"><h2>innerHTML 연습</h2></div>
<div id="test2">안녕하세요</div>
<input type="button" value="처리 1" onclick="func1()">
<input type="button" value="처리 2" onclick="func2()">
<br>
<div id="show1"></div>
<div id="show2"></div>

</body>
</html>

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function func1(){
	document.getElementById("show").innerText = "전통적인 이벤트 처리";
	
}

let a = 10;
let b = {
		funcNew:function(){
			document.getElementById("show").innerText = "b 객체의 메소드 처리";
		},
		funcNew2:function(){
			document.getElementById("show").innerHTML = "<h1>b 객체의 멤버 처리</h1>";
		},
}

</script>

<script type="text/javascript">
// window.onload() : 자바스크립트에서 페이지가 로드(서버로부터 문서 수신이 완료)되면 자동으로 실행되는 전역 콜백함수.
window.onload = function(){	// 1회 : 초기화 담당
	//alert("ok");
	const exBtn1 = document.getElementById("btn1");	// 버튼을 읽어 변수가 기억
	exBtn1.onclick = function(){	// 이벤트 장착
		document.getElementById("show").innerText = "클릭1 선택";
	}
	
	const exBtn2 = document.getElementsByName("myBtn");	// 배열
	console.log(exBtn2.length);
	exBtn2[0].onclick = function(){
		document.getElementById("show").innerText = "클릭2 누름";
	}
	exBtn2[1].onclick = function(){
		document.getElementById("show").innerText = "클릭3 처리";
	}
	
	exBtn3 = document.getElementsByTagName("input")[6];
	exBtn3.onclick = function(){
		document.getElementById("show").innerText = "클릭4 수행";
	}
	
	// 이벤트 연결 및 해제
	// 컴포넌트.addEventListener("이벤트 종류", 핸들러 함수)
	document.getElementById("show").addEventListener("click", abcFunc);
	
}

function abcFunc(){
	document.getElementById("show").innerText = "클릭5 이벤트 연결처리";
	// 이벤트 연결 해제
	document.getElementById("btn5").removeEventListener("click", abcFunc);
}

</script>

</head>
<body>
<h2>이벤트 처리</h2>
<input type="button" value="버튼1" onclick="func1()"><br>
<input type="button" value="버튼2" onclick="b.funcNew()"><br>
<input type="button" value="버튼3" onclick="b.funcNew2()"><br>
<hr>
<input type="button" value="클릭1" id="btn1">
<input type="button" value="클릭2" id="btn2" name="myBtn">
<input type="button" value="클릭3" id="btn3" name="myBtn">
<input type="button" value="클릭4" id="btn4">
<input type="button" value="클릭5" id="btn5">

<hr>
<div id="show"></div>

</body>
</html>

 

 

 

클릭했을 때의 이벤트 처리에 대해서도 실습했다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = () => {
	document.getElementById("colorW").onclick = function(){
		document.bgColor = "white";
	}
	document.getElementById("colorG").onclick = () =>{
		document.bgColor = "#00ff00";
	}
	/*
	document.getElementById("colorR").onclick = () =>{
		document.bgColor = "rgb(255, 0, 0)";	// rgb(100%, 0%, 0%)
	}*/
	document.querySelector("#colorR").onclick = () =>{
		document.bgColor = "rgb(255, 0, 0)";
	}
	
	document.querySelector(".hello").onclick = () => {
		document.querySelector("#show").innerText = "안녕하세요";
	}
	
	document.querySelector("#calc").ondblclick = () => {
		let ss = `연산결과는 ${10 + 20}`;
		document.querySelector("#show").innerText = ss;
	}
	
	// hover 기능
	document.querySelector("#name").onmouseover = () => {
		document.querySelector("#show").innerText = "<h1>난 홍길동</h1>";
	}
	
	document.querySelector("#name").onmouseout = () => {
		document.querySelector("#show").innerText = "";
	}
	
	// a tag : click 이벤트가 기본 등록됨
	
	document.querySelector("#daum").onclick = (event) =>{
		event.preventDefault();	// 해당 태그의 고유 기능 해제
		console.log(event);
		console.log(`x좌표 : ${event.x} y좌표 : ${event.y}`);
	}
	
	//select
	const sdata = document.querySelector("#sel");
	/*
	sdata.onclick = function(){
		document.querySelector("#show").innerHTML = sdata.value;
		console.log(sdata.value);
	}*/
	
	sdata.onchange = function(){
		document.querySelector("#show").innerHTML = sdata.value;
		console.log(sdata.value);
	}
	
};

</script>

</head>
<body>
<h2>여러 이벤트 경험</h2>
<input type="button" value="흰색" id="colorW">
<!-- 
<input type="button" value="녹색" id="colorG">
<input type="button" value="적색" id="colorR">
 -->
<span id="colorG"> 녹색 </span>
<b id="colorR" style = "border: 1px solid black; cursor : pointer;"> 적색 </b>
<hr>
이벤트 종류 연습<br>
<button id="Hello" class="hello">인사하기(click)</button>
<button id="calc">계산하기(dblclick)</button>
<button id="name">이름알기(mouseover)</button>
<br>
<a href="https://m.daum.net" id="daum">앵커 태그 클릭</a>
<br>
<select id="sel">
	<option value="프로그래머">프로그래머</option>
	<option value="웹퍼블리셔">웹퍼블리셔</option>
	<option value="프로게이머">프로게이머</option>
</select>

<hr>
<div id="show">출력장소 1</div>

</body>
</html>

 

 

이를 활용한 간단한 캘린더 만들기

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = () => {
	document.querySelector("#btnShow").addEventListener("click", func);
	
};

function func(){
	//alert("a");
	let now = new Date();
	let year = now.getFullYear();
	let month = now.getMonth();
	let day = now.getDate();
	console.log(`${year} ${month + 1} ${day}`);
	
	// 현재 월의 1일은 무슨 요일인지?
	let setDate = new Date(year, month, 1);
	let firstDay = setDate.getDate();
	console.log(firstDay);	// 1
	let yoil = setDate.getDay();	// 요일 반환 0(일) ~ 6(토) 까지 값 반환
	console.log(yoil);
	
	// 현재 월의 일 수는?
	const nalsu = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	
	// 2월 일 수는 윤년 체크
	if(year % 4 === 0 && year % 100 !== 0 || year % 400 === 0){
		nalsu[1] = 29;
	}
	
	let str = makeCalendar(yoil, nalsu[month], year, month + 1, day);
	document.querySelector("#disp").innerHTML = str;
	
	document.querySelector("#etc").style.display = ""; // 버튼 등장
	
}

function makeCalendar(yoil, nalsu, year, month, day){
	let str = `<table>`;
	str += `<tr><th colspan="7">${year}년 ${month}월</th></tr>`;
	str += `<tr>`;
	let week = new Array("일", "월", "화", "수", "목", "금", "토");
	for(let i=0;i<week.length;i++){
		str += `<th>${week[i]}</th>`;
	}
	str += `</tr>`;	// 년월 요일명 출력 완료
	
	// 날 수 채우기
	let no = 1;
	let currentCell = 0;
	// 이번 달은 몇 주?
	let ju = Math.ceil((nalsu + yoil) / 7);
	console.log(`이번달은 ${ju}`);
	
	for(let r=0; r<ju; r++){	// 행
		str += `<tr style="text-align:center">`;
		for(let col=0; col<7; col++){	// 열
			if(currentCell < yoil || no > nalsu){ // 예) 첫 주의 1일이 수요일이면 이전은 공백처리, 일 수까지만 출력
				str += `<td>&nbsp;</td>`;
				currentCell++;
			}else {
				if(no === day){	// 오늘의 글자색은 파랑으로 표시
					str += `<td style="color:blue">${no}</td>`;
				}else {
					str += `<td>${no}</td>`;
				}
				no++;
			}
		}
		
		str += `</tr>`;
	}
	
	str += `</table>`;
	return str;
}

</script>

</head>
<body>
<button id="btnShow">달력보기</button>
<br><br>
<div id="disp"></div>
<br>
<div id="etc" style="display: none;">
	<button id="btnPyear">이전 년</button>
	<button id="btnPmonth">이전 월</button>
	<button id="btnNmonth">다음 월</button>
	<button id="btnNyear">다음 년</button>
</div>


</body>
</html>