본문 바로가기
JavaScript

[JavaScript] 이벤트(Event)

by 이잔디 2022. 3. 8.

이벤트(Event)

- 웹 페이지에서 여러 종류의 상호작용이 있을 때 마다 이벤트 발생

- JS를 사용하여 DOM에서 발생하는 이벤트를 감지하여 이벤트에 대응하는 여러 작업 수행

- 이벤트는 일반적으로 함수와 연결되고, 함수는 이벤트가 발생되기 전에는 실행되지 않다가 이벤트가 발생할 경우 실행.

- Handler , Listener

마우스 이벤트(Mouse Event)

- 마우스 이벤트 핸들러에 전달되는 이벤트 객체에는 마우스 위치와 버튼 상태 등의 정보를 담고 있음

이벤트 설명
onclick  element 클릭 했을 때 발생
ondbclick  element 더블 클릭 했을 때 발생
onmouseup  element에서 마우스 버튼을 올렸을 때 발생
onmousedown  element에서 마우스 버튼을 눌렀을 때 발생
onmouseover  마우스를 움직여서  element 밖에서 안으로 들어 올 때 발생
onmouseout  마우스를 움직여서  element 안에서 밖으로 나갈 때 발생
onmousemove  마우스를 움직일 때 발생

 

키보드 이벤트(Keyboard Event)

- 운영체제에 영향을 받으므로 특정 키가 이벤트 핸들러에서 전달되지 않을 수 있음

- 키보드 커서가 나타내는 요소가 없다면 document에서 이벤트 발생

이벤트 설명
onkeypress  키보드가 눌려 졌을 때 발생 (ASCII)
onkeydown  키보드를 누르는 순간 발생 (KeyCode)
onkeyup  키보드를 누르고 있던 키를 뗄 때 발생

 

폼 이벤트(Form Event)

- form이 전송될 때 submit 이벤트 발생

- form 초기화할 때는 reset 이벤트 발생 

- submit과 reset은 이벤트 핸들러에서 취소 가능

이벤트 설명
onsubmit  form이 전송될 때 발생
onreset  입력 form이 reset될 때 발생
oninput   input또는 textarea의 값이 변경 되었을 때 발생
onchange  select box, checkbox, radio button의 상태가 변경 되었을 때 발생
onfocus(focusin)  input과 같은 요소에 입력 포커스가 들어 올 때 발생
onblur(focusout)  input과 같은 요소 등에서 입력 포커스가 다른 곳으로 이동할 때 발생
onselect  input, textarea에 입력 값 중 일부가 마우스 등으로 선택될 때 발생

 

이벤트 핸들러 

인라인 이벤트 핸들러

- JavaScript 초기에는 HTML 요소의 내부에서 직접 이벤트 핸들러를 등록

- HTML 코드를 JavaScript 코드가 침범한다는 문제가 있음

- 여러 개의 함수를 한번에 호출 가능

- 최근 CBD(Component Based Development) 방식의 Angular / React / Vue.js와 같은 프레임워크와 라이브러리에서는 인라인 방식으로 이벤트를 처리 → HTML, CSS, JS를 view의 구성 요소로만 보기 때문

<body>
    <div id = "div1" onclick = "f1(); f2();"> 클릭 </div>
    <script type = "text/javascript">
        let f1 = function(){
        	alert("hi");
        }
        
        let f2 = function(){
            alert("bye");
        }
    </script>
</body>

이벤트 핸들러 프로퍼티 방식 

- JavaScript에서 이벤트 핸들러를 등록함으로써 HTML 코드와 JS 코드를 분리 

- 이벤트 대상이 되는 특정 DOM을 선택하고 이벤트 핸들러를 등록

- 인라인 이벤트 핸들러와 달리 하나의 이벤트 핸들러만 바인딩 할 수 있다는 단점을 가짐

<body>
    <div id = "div1"> 클릭 </div>
    <script type = "text/javascript">
        document.getElementById("div1").onclick = function(){
            alret('hi');
        }
    </script>
</body>

addEventListener 메소드 방식

- addEventListener(arg1, arg2[, arg3])를 이용하여 더 세밀한 이벤트 제어

→ addEventListener(이벤트 이름, 이벤트 핸들러, 캡처링 여부 )

- 이벤트 이름에는 'on'을 제거한 이벤트 이름 사용

- addEventListener 메소드를 이용하여 대상 DOM 요소에 이벤트를 바인딩하고 해당 이벤트가 발생했을 때 실행될 콜백 함수(이벤트 핸들러)를 지정

- 하나의 이벤트에 대해 하나 이상의 이벤트 핸들러를 추가할 수 있음

- HTML 요소 뿐만 아니라 모든 DOM(HTML, XML, SVG)에 대해 동작

<body>
    <div id = "div1"> 클릭 </div>
    <script type = "text/javascript">
        document.getElementById("div1").addEventListener('click', f1, false);
        
        function f1(){
            alert("hi");
        }
    </script>
</body>

* 함수에 인자를 전달해야할 때

- 함수의 인자를 전달해야할 때는 익명함수를 사용해서 이벤트 핸들러 내부에서 함수를 호출하는 방식으로 해결한다. 

<body>
    <div> id <input type = "text"></div>
    <div class = "message"> </div>
    
    <script type = "text/javascript">
        const MIN_LENGTH = 6;
        const input = document.querySelector("");
        const msg = document.querySelector("message");
        
        function f1(len){
            if(input.value.length < len){
                msg.innerHTML = len + "이상 입력해주세요";
            }else{
                msg.innerHTML = '';
            }
        }
        
        // 이렇게 하면 이벤트 발생 시까지 대기하지 않고 바로 실행
        // 그렇다고 f1의 형태로 넘겨주면 인자를 전달할 수 없음
        input.addEventListener("blur", f1(MIN_LENGTH));
        
        // 이벤트 핸들러 내부에서 함수를 호출하는 방식으로 해결!!!!!
        input.addEventListener("blur", function(){
            f1(MIN_LENGTH);
        });
    </script>
</body>