본문 바로가기

웹언어/JAVASCRIPT

[JS강좌] 23강 이벤트객체의 속성과 메서드 - 오쌤의 니가스터디

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

** 동영상으로 보고 싶은 분은 아래 주소를 클릭하세요.

https://youtu.be/Ys-mZxuLqc8

 

 

 

 

 

 

 

 

 

 

 

1. 이벤트객체

- 이번 강좌에서는 이벤트 객체의 속성과 메서드에 대해서 배워보도록 하겠습니다.

- 이벤트객체는 DOM과 관련된 이벤트가 발생되면 발생되는 관련 정보를 저장하는 객체라고 생각하시면 됩니다.

- 예시로 마우스로 이벤트가 발생되면 마우스의 위치값을 저장해주는 것을 마우스이벤트 객체라 보면 됩니다.

- 예시로 키보드로 이벤트가 발생되면 누른 키의 키코드를 저장해주는 것을 키보드이벤트 객체라 보면 됩니다.

 

 

## 문법

//1. 고전이벤트사용
문서객체선택.on이벤트타입명 = function(이벤트객체매개변수){

}

//2. addEventLister()사용
문서객체선택.addEventListener('이벤트타입',function(이벤트객체매개변수){

});

 

 

## 코드 예시

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
    </head>
    <body>
        <button id="btn">버튼</button>
        <script>
            var btn = document.getElementById('btn');

            btn.onclick = function(e){
                console.log(e.type);
            }
        </script>
    </body>
</html>

- 보통 이벤트객체매개변수는 [event] 혹은 [e]라고 많이 씁니다.

- 매개변수는 영어로 뭐라고 써도 호출만 잘해서 쓰면 문제가 없지만, 이해를 위해 [event] 혹은 [e]라고 작성해주세요.

 

 

## 코드 결과

- 클릭하면 이벤트타입인 click을 colsole에 잘 반환하는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

2. 이벤트 객체가 공통적으로 사용하는 속성과 메서드

- 보통 마우스이벤트가 갖는 속성/메서드, 키보드이벤트가 갖는 속성/메서드는 다릅니다.

- 하지만 모든 이벤트가 공통으로 갖는 속성과 메서드도 있습니다.

 

 

 

1) 공통 이벤트객체 속성과 메서드의 종류

종류 설명
bubbles 이벤트가 버블링되는지 true/false로 처리함
cancleable 이벤트의 기본 동작 취소가능 여부를 true/false로 처리함
currentTarget 현재 이벤트를 처리 중인 요소를 반환
defaultPrevented true면 preventDefault()메서드가 호출상태
eventPhase 현재 평가 중인 이벤트 흐름단계를 반환(1: 캡쳐링, 2: 타깃, 3: 버블링)
stopImmediatePropagation( ) 이벤트 캡처링, 이벤트 버블링 모두 취소하며 다른 이벤트 핸들러 호출을 막음
stopPropagation() 이벤트 캡처링, 이벤트 버블링 모두 취소하며 bubbles가 true일때 기능함.
target 이벤트를 trigger한 요소를 반환
type 발생된 이벤트 타입을 반환
view 이벤트가 발생한 window개체에 대한 참조를 반환

 

 

 

 

 

 

 

2) 이벤트 흐름의 3단계

종류 설명
캡처링(capturing) 이벤트가 하위 요소로 전파되는 단계
타깃(target) 이벤트가 실제 타깃 요소에 전달되는 단계
버블링(bubbling) 이벤트가 상위요소로 전파되는 단계

https://www.w3.org/TR/DOM-Level-3-Events/

- 위 그림은 이벤트의 흐름을 보여주는 그림 예시입니다. 

 

 

 

 

 

 

 

 

 

 

 

3) 이벤트 버블링의 예시

## 코드 예시

- h1태그의 자손으로 a태그를 처리했습니다. 그리고 각각 요소는 클릭하면 배경색이 바뀌도록 처리해봅시다.

- h1을 클릭하면 배경색을 파란색으로 변경, a태그를 클릭하면 배경색을 빨간색으로 변경하도록 처리했습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
        <style>
            *{ padding: 0; margin: 0; }

            h1{ margin: 20px;  padding: 20px; border: 3px solid black; }
            a{ display: inline-block; padding: 20px; border: 3px solid black; }
        </style>
    </head>
    <body>
        <h1 id="title">
            <a href="#" id="link">링크태그</a>
        </h1>
        <script>
            var title = document.getElementById('title');
            var link = document.getElementById('link');

            title.onclick = function(){
                this.style.backgroundColor = 'blue';
            }
            link.onclick = function(){
                this.style.backgroundColor = 'red';
            }
        </script>
    </body>
</html>

 

 

## 코드 결과

- h1태그를 클릭하면 자신 요소만 파란색으로 변경되는 것이 보입니다.

- 하지만 a태그를 클릭하면 부모의 h1도 a태그도 모두 배경색이 변경되는 것을 확인할 수 있습니다.

- 이것을 이벤트 버블링이라고 합니다.

 

 

 

 

 

 

 

 

 

 

 

4) stopPropagation()

- 이벤트가 버블링이나 캡쳐링이 일어날때 이벤트 전달을 방지하는 메서드입니다.

 

## 코드 예시

- 위에서 이벤트 전달되는 코드에서 a태그에 stopPropagation()코드를 추가해보았습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
        <style>
            *{ padding: 0; margin: 0; }

            h1{ margin: 20px;  padding: 20px; border: 3px solid black; }
            a{ display: inline-block; padding: 20px; border: 3px solid black; }
        </style>
    </head>
    <body>
        <h1 id="title">
            <a href="#" id="link">링크태그</a>
        </h1>
        <script>
            var title = document.getElementById('title');
            var link = document.getElementById('link');

            title.onclick = function(){
                this.style.backgroundColor = 'blue';
            }
            link.onclick = function(e){
                e.stopPropagation();
                this.style.backgroundColor = 'red';
            }
        </script>
    </body>
</html>

- 이벤트 콜백함수에 매개변수로 [e]라고 설정하여 이벤트객체를 선택할 수 있도록 처리했습니다.

- 그리고 그안에 [e.stopPropagation();]를 처리해서 이벤트 전달을 막았습니다.

 

 

## 코드 결과

 

- 아까와는 다르게 a태그를 클릭해도 h1에 이벤트가 적용되지 않는 것을 확인할 수 있습니다.

- 하지만 stopPropagation()을 많이 사용하는 것보단 이벤트 타킷을 잘 정하는 것이 코드에는 훨씬 좋습니다.

- 이러한 메서드들을 사용하는 경우  분석시스템의 코드가 동작하지 않기 때문에 분석이 제대로 되지 않아 죽은 영역(dead zone)이라고 부르기도 합니다.

- 분석 시스템의 경우 네비게이션에서 그 요소를 클릭한 횟수 등을 확인할 수 있어 어떤 페이지에 많이 들어가는지 알 수 있게 해줍니다. 하지만 stopPropagation()을 사용하면 그것을 알 수 없기 때문에 사용을 많이 하는 것은 좋지 못합니다.

 

 

 

 

 

 

 

 

 

 

 

 

5) preventDefault()

- 요소가 갖고 있는 기본이벤트를 제거해주는 메서드입니다.

- 대표적인 기본이벤트는 a태그가 페이지를 이동해주는 이벤트를 갖고 있습니다.

- 두번째로는 form태그가 데이터를 전송하는 이벤트를 갖고 있습니다.

 

 

## a태그 기본이벤트 제거 코드 예시

- 이번엔 링크된 [오쌤의 니가스터디]라는 글자를 클릭하면 페이지로 바로 이동되지 않고 [오쌤의 니가스터디로 이동하겠습니까?]라는 confirm창이 뜨도록 해서 확인을 누르면 주소가 이동되게 처리하겠습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
    </head>
    <body>
        <h1>
            <a href="https://ossam5.tistory.com/" id="link">오쌤의 니가스터디</a>
        </h1>
        <script>
            var link = document.getElementById('link');

            link.onclick = function(e){
                e.preventDefault(); //기본이벤트 제거

                var addr = this.getAttribute('href'); //a태그가 원래 갖고 있는 href의 속성값을 담는 변수

                //확인취소창
                var q = confirm('오쌤의 니가스터디로 이동하시겠습니까?');

                if(q){ //확인버튼을 클릭하면
                    location.assign(addr); //원래 주소로 주소를 변경
                }
            }
        </script>
    </body>
</html>

 

 

## a태그 기본이벤트 제거 코드 결과

- 처음 클릭했을때부터 기본이벤트가 제거되서 페이지 이동이 되지 않습니다.

- 취소버튼을 누르면 페이지가 이동되지 않고, 확인버튼을 누르면 페이지가 이동되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 마우스 이벤트 객체

- 이번에는 마우스 이벤트(click, mouseenter 등)가 발생될때 생성되는 이벤트 객체를 확인해보도록 하겠습니다.

 

 

 

1) 마우스 이벤트 객체 속성과 메서드의 종류

종류 설명
altKey 마우스 이벤트가 발생되었을때 [Alt]키가 눌렀는지를 true/false로 반환
button 마우스 이벤트가 발생되었을때 눌린 마우스 버튼을 반환
buttons 마우스 이벤트가 발생되었을때 눌린 마우스 버튼들을 반환
clientX 마우스 이벤트가 발생되었을때 현재 창을 기준으로 마우스 포인터의 X축 좌표를 반환
clientY 마우스 이벤트가 발생되었을때 현재 창을 기준으로 마우스 포인터의 Y축 좌표를 반환
ctrlKey 마우스 이벤트가 발생되었을때 [Ctrl]키가 눌렸는지를 true/false로 반환
getModifierState() 삽입/삭제의 영향을 받는 대상 범위를 포함하는 배열을 반환
metaKey 마우스 이벤트가 발생되었을때 메타키가 눌렸는지를 true/false로 반환
** 메타키(metakey) : 윈도우에서는 윈도우키를 의미하는데, 보통 OS별로 다르기 때문에 메타키라고 부름
movementX 마지막 mousemove 이벤트 위치를 기준으로 마우스포인터의 X축 좌표 반환
movementY 마지막 mousemove 이벤트 위치를 기준으로 마우스포인터의 Y축 좌표 반환
offsetX 대상 요소의 가장자리 위치를 기준으로 마우스포인터의 X축 좌표 반환
offsetY 대상 요소의 가장자리 위치를 기준으로 마우스포인터의 Y축 좌표 반환
pageX 마우스 이벤트가 발생되었을 때 문서 기준으로 마우스포인터의 X축 좌표 반환
pageY 마우스 이벤트가 발생되었을 때 문서 기준으로 마우스포인터의 Y축 좌표 반환
region 마우스 이벤트 영향을 받는 히트영역의 id를 반환, 영역이 아니면 null반환
relatedTarget 마우스 이벤트를 발생시킨 요소와 관련된 요소(있는 경우만) 반환 
screenX 마우스 이벤트가 발생되었을 때 화면을 기준으로 마우스포인터의 X축 좌표 반환
screenY 마우스 이벤트가 발생되었을 때 화면을 기준으로 마우스포인터의 Y축 좌표 반환
shiftKey 마우스 이벤트가 발생되었을 때 [Shift]키가 눌렀는지를 true/false로 반환
which 마우스 이벤트가 발생되었을때 어떤 마우스 버튼을 눌렀는지를 반환

 

 

 

 

 

 

 

 

 

 

 

2) pageX/pageY

## 코드 예시

- 마우스를 움직일때 마우스 포인터의 좌표값을 문서를 기준으로 확인해보겠습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
    </head>
    <body>
        <h1 id="text01"></h1>
        <h1 id="text02"></h1>
        <script>
            //1. 문서객체 변수에 담기
            var text01 = document.getElementById('text01');
            var text02 = document.getElementById('text02');

            //2. body전체에서 마우스를 움직일때 마우스포인터 좌표값을 h1태그에 반환
            document.onmousemove = function(e){
                var x = e.pageX;
                var y = e.pageY;

                text01.textContent = x;
                text02.textContent = y;
            }
        </script>
    </body>
</html>

 

 

## 코드 결과

 

 

 

 

 

 

 

 

 

 

 

 

3) clientX/clientY

## 코드 예시

- 마우스를 움직일때 원요소가 마우스를 따라다니도록 처리해보겠습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
        <style>
            #circle{ position: absolute; left: 0; top: 0; background-color: navy; width: 50px; height: 50px; border-radius: 25px; }
        </style>
    </head>
    <body>
        <div id="circle"></div>
        <script>
            //1. 원을 문서객체 변수에 담기
            var circle = document.getElementById('circle');

            //2. body전체에서 마우스를 움직일때 원이 마우스포인터 따라다니게 처리
            document.onmousemove = function(e){
                var x = e.clientX;
                var y = e.clientY;

                //25를 뺀 이유는 원의 반지름으로 포인터가 가운데 오도록 처리
                circle.style.left = (x - 25) + 'px';
                circle.style.top = (y - 25) + 'px';
            }
        </script>
    </body>
</html>

 

 

## 코드 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

4. 키보드 이벤트 객체

- 이번에는 키보드 이벤트(keypress, keyup 등)가 발생될때 생성되는 이벤트 객체를 확인해보도록 하겠습니다.

 

 

 

1) 키보드 이벤트 객체 속성과 메서드의 종류

종류 설명
altKey 키보드 이벤트가 발생되었을때 [Alt]키가 눌렀는지를 true/false로 반환
charCode keypress 이벤트가 발생되었을때 눌린 키의 유니코드 문자 코드를 반환
code 키보드 이벤크가 발생되었을때 눌린 키의 코드를 반환
ctrlKey 키보드 이벤트가 발생되었을때 [Ctrl]키가 눌렸는지를 true/false로 반환
isComposing 이벤크 상태가 작성 중인지 여부를 true/false로 반환
key 이벤트가 나타내는 키의 키값을 반환
keyCode 키보드 이벤트가 발생되었을때 눌린 키의 유니코드 키코드를 반환
location 키보드 또는 장치의 키 위치를 반환
metaKey 키보드 이벤트가 발생되었을때 메타키가 눌렸는지를 true/false로 반환
** 메타키(metakey) : 윈도우에서는 윈도우키를 의미하는데, 보통 OS별로 다르기 때문에 메타키라고 부름
repeat 키가 반복적으로 눌리고 있는지 여부를 반환
shiftKey 키보드 이벤트가 발생되었을 때 [Shift]키가 눌렀는지를 true/false로 반환
which 키보드 이벤트가 발생되었을 때 눌린 키의 유니코드 문자 코드를 반환

 

 

 

 

 

 

 

2) keyCode

## 코드 예시

- 키보드를 눌렀을때의 눌린 키의 유니코드를 반환해보도록 하겠습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
    </head>
    <body>
        <input type="text" id="textbox">
        <p>키코드 : <span id="result"></span></p>
        <script>
            //1. 문서객체 변수에 담기
            var textbox = document.getElementById('textbox');
            var result = document.getElementById('result');

            //2. 키보드 이벤트 발생
            textbox.onkeypress = function(e){
                var num = e.keyCode;

                result.textContent = num;
            }
        </script>
    </body>
</html>

 

 

# 코드 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. 마우스휠 이벤트 객체

- 이번에는 마우스휠 이벤트가 발생될때 생성되는 이벤트 객체를 확인해보도록 하겠습니다.

 

 

 

1) 마우스휠 이벤트 객체 속성과 메서드의 종류

종류 설명
deltaX 마우스 휠의 가로 스크롤 정도를 반환(x축)
- 보통 오른쪽으로 가면 양수, 왼쪽으로 이동하면 음수
deltaY 마우스 휠의 세로 스크롤 정도를 반환(y축)
- 보통 아래쪽으로 가면 양수, 위쪽으로 가면 음수
deltaZ z축에 대한 마우스 휠의 스크롤 정도를 반환
deltaMode 델타값(픽셀, 라인 또는 페이지)의 측정 단위를 나타내는 숫자를 반환

- 과거에 mousewheel이벤트 일때는 [originalEvent.wheelDelta]라는 속성도 있었습니다.

 

 

 

 

 

 

 

 

 

 

2) deltaY

## 코드 예시

- 스크롤바를 내릴때 deltaY값을 h1태그에 담아보도록 하겠습니다.

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS - DOM</title>
        <style>
            body{ height: 2000px; }
            #text{ position: fixed; top: 10px; left: 10px; }
        </style>
    </head>
    <body>
        <h1 id="text"></h1>
        <script>
            //1. 문서객체 변수에 담기
            var text = document.getElementById('text');

            //2. 마우스 휠 처리
            document.onwheel = function(e){
                var top = e.deltaY;

                text.textContent = top;
            }
        </script>
    </body>
</html>

 

 

 

## 코드 결과

- 크롬이라서 아래로 내릴때 [100]으로 처리, 위로 올릴때 [-100]으로 처리됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형