Seojoo21 2022. 2. 22. 10:25

*출처: Do it! 한권으로 끝내는 웹 기본 교과서 HTML+CSS+자바스크립트 웹 표준의 정석, 고경희, 이지스퍼블리싱 

 

 

 

- 대부분의 함수는 사용자가 화면에서 버튼을 클릭하거나 항목을 선택했을 때 실행된다. 이처럼 버튼을 클릭하거나 항목을 선택하는 것을 '이벤트'라고 한다. 그리고 이벤트가 발생했을 때 실행하는 함수를 '이벤트 처리기'라고 한다. 

 

1. 자바스크립트의 주요 이벤트 

http://developer.mozilla.org/en-US/docs/Web/Events 

 

Event reference | MDN

Events are fired to notify code of "interesting changes" that may affect code execution. These can arise from user interactions such as using a mouse or resizing a window, changes in the state of the underlying environment (e.g. low battery or media events

developer.mozilla.org

1) 마우스 이벤트 

종류 설명
click 사용자가 HTML 요소를 클릭할 때 이벤트가 발생한다.
dbclick 사용자가 HTML 요소를 더블클릭할 때 이벤트가 발생한다.
mousedown 사용자가 요소 위에서 마우스 버튼을 눌렀을 때 이벤트가 발생한다.
mousemove 사용자가 요소 위에서 마우스 포인터를 움직일 때 이벤트가 발생한다.
mouseover 마우스 포인터가 요소 위로 옮겨질 때 이벤트가 발생한다. 
mouseout 마우스 포인터가 요소를 벗어날 때 이벤트가 발생한다. 
mouseup 사용자가 요소 위에 놓인 마우스 버튼에서 손을 뗄 때 이벤트가 발생한다. 

2) 키보드 이벤트

종류 설명
keydown 사용자가 키를 누르는 동안 이벤트가 발생한다. 
keypress 사용자가 키를 눌렀을 때 이벤트가 발생한다. 
keyup 사용자가 키에서 손을 뗄 때 이벤트가 발생한다. 

3) 문서 로딩 이벤트

종류 설명
abort 문서가 완전히 로딩되기 전에 불러오기를 멈췄을 때 이벤트가 발생한다. 
error 문서가 정확히 로딩되지 않았을 때 이벤트가 발생한다.
load 문서 로딩이 끝나면 이벤트가 발생한다.
resize 문서 화면 크기가 바뀌었을 때 이벤트가 발생한다. 
scroll 문서 화면이 스크롤되었을 때 이벤트가 발생한다.
unload 문서에서 벗어날 때 이벤트가 발생한다. 

 4) 폼 이벤트

- 폼은 로그인, 검색, 게시판, 설문 조사처럼 사용자가 입력하는 모든 요소를 가리킨다. 아래 표는 폼 요소에 내용을 입력하면서 발생하는 이벤트이다.

종류 설명 
blur 폼 요소에 포커스를 잃었을 때 이벤트가 발생한다.
change 목록이나 체크 상태 등이 변경되면 이벤트가 발생한다. <input>, <select>, <textarea> 태그에서 사용한다.
focus 폼 요소에 포커스가 놓였을 때 이벤트가 발생한다. <label>, <select>, <textarea>, <button> 태그에서 사용한다. 
reset 폼이 리셋되었을 때 이벤트가 발생한다.
submit submit 버튼을 클릭했을 때 이벤트가 발생한다.  

 

2. 이벤트 처리기 알아보기

1) 이벤트 처리기의 기본 형식

- HTML 태그안에서 'on' 다음에 '이벤트명'을 붙여서 속성 이름을 만들고, 그 다음에 실행할 이벤트 처리기의 함수명을 작성한다.

<태그 on이벤트명 = "함수명">

- 예를 들어 마우스로 클릭했을 때의 이벤트 이름은 click이다. <a> 태그 안에 onclick 속성을 만들고 실행할 함수를 연결한다.

..
<body>
	<ul>
		<li><a href="#" onclick="alert('버튼을 클릭했습니다.')">Green</a></li>
		<li><a href="#" onclick="alert('버튼을 클릭했습니다.')">Orange</a></li>
		<li><a href="#" onclick="alert('버튼을 클릭했습니다.')">Purple</a></li>
	</ul>

 

- 이벤트가 발생한 후에 여러 가지 명령을 실행해야 한다면, 그 명령을 묶어서 하나의 자바스크립트 함수로 만드는 것이 좋다. 그리고 이벤트가 발생할 때 함수 이름과 인수를 지정하여 실행한다.

- 다음은 웹 요소의 배경색을 바꾸는 changeBg(color) 함수를 미리 만들어서 실행하는 예제이다. 항목을 클릭할 때마다 green 이나 orange, purple의 색상값을 인수로 넘겨서 changeBg(color) 함수를 실행한다.

..
<body>
	<ul>
	  <li><a href="#" onclick="changeBg('Green')">Green</a></li>
	  <li><a href="#" onclick="changeBg('Orange')"">Orange</a></li>
	  <li><a href="#" onclick="changeBg('Purple')">Purple</a></li>
	</ul>		
	<div id="result"></div>
</body>

<script>
    function changeBg(color){
        var result = document.querySelector('#result');
        result.style.backgroundColor = color;
}
</script>

 

3. DOM을 이용한 이벤트 처리기 

- 위의 2번에서 살펴본 것처럼 HTML 요소에 이벤트 처리기를 지정하면 태그 속성과 자바스크립트 소스가 섞인다. 그래서 자바스크립트를 수정하려면 HTML의 태그와 속성을 하나씩 찾아봐야한다.

- 하지만 DOM(문서 객체 모델)을 이용하여 이벤트 처리기를 지정하면 태그와 자바스크립트 소스를 분리해서 보기 좋게 사용할 수 있다.

 

- 예를 들어 웹 요소를 클릭했을 때 실행할 함수를 연결하려면 다음과 같은 기본 형식으로 사용한다.

웹 요소.onclick = 함수;

- 자바스크립트에서는 웹 요소를 여러 방법으로 가져올 수 있는데 그중에서 함수 querySelector() 를 사용하여 가져오는 것이 쉽다. 

- querySelector()의 괄호 안에는 클래스 이름이나 id 이름 또는 다양한 선택자를 넣을 수 있다.

 

- 다음은 id="change"인 버튼을 클릭했을 때 글자색을 바꾸는 예제이다. querySelector()를 사용해 버튼 요소를 가져오고 변수 changeBttn에 저장한다. 그리고 changeBttn에 onclick을 사용해 changeColor() 함수를 연결한다. 이때 주의할 점은 함수의 이름만 사용하고 괄호는 붙이지 않아야 한다는 것이다.

<body>
	<button id="change">글자색 바꾸기</button>	
	<p>내용</p>
	
	<script>
         // 방법 1 : 웹 요소를 변수로 지정 & 미리 만든 함수 사용
        var changeBttn = document.querySelector('#change'); 
        // querySelector의 괄호 () 안에 들어간 '#change'가 작동할 버튼의 id값이다.
        changeBttn.onclick = changeColor; // 함수 이름 뒤에 괄호()가 없다. 

        function changeColor() {
            document.querySelector("p").style.color = "#f00";
        }

	</script>
</body>

 

- 위의 스크립트 코드는 조금 다르게 표현할 수도 이다. 웹 요소를 프로그램 안에서 여러번 사용하지 않는다면 다음과 같이 변수에 할당하지 않고 직접 사용해도 된다. 

<body>
	<button id="change">글자색 바꾸기</button>	
	<p>내용</p>
	
	<script>
         // 방법 2 : 웹 요소를 따로 변수로 만들지 않고 사용
        document.querySelector('#change').onclick = changeColor; // 함수 이름 뒤에 괄호()가 없다. 

        function changeColor() {
            document.querySelector("p").style.color = "#f00";
        }

	</script>
</body>

 

- 또는 함수를 딱 한번만 사용한다면 위 코드에서 changeColor라는 함수 이름이 들어갔던 자리에 직접 함수를 선언해도 된다.

<body>
	<button id="change">글자색 바꾸기</button>	
	<p>내용</p>
	
	<script>
         // 방법 3 : 함수를 직접 선언 
        document.querySelector('#change').onclick =  function() {
            document.querySelector("p").style.color = "#f00";
        }
	</script>
</body>