JavaScript

[JS 스터디] 자바스크립트에서 이벤트 관리하기

jjin502 2023. 3. 2. 19:03

우리가 많이 다루는 이벤트에 대해 확실하게 정리한 글입니다.

1. 이벤트란 ?

자바스크립트 안의 이벤트는 클릭, 스크롤 내리기 등 사용자와 웹페이지가 상호작용을 하며 브라우저가 감지하는 것.

* 이벤트 리스너, 이벤트 핸들러를 통해 처리 함.

ex) click, contextmenu, keydown, keyup, submit 등...

 

2. 등록 방법

- 인라인(inline) : 이벤트를 HTML요소로 직접 지정하는 방식. -> 유지 보수에 좋지 못함.

<button onclick="console.log('Hello World!);">Plz Click!</button>

- 프로퍼티(Property) : 선택자를 이용함. -> 인라인 방식의 단점은 보완하지만, 한 번에 하나의 이벤트만 가능함.

<button onclick="firstBtn">click</button>

<script>
  let firstBtn = document.querySelector('#firstBtn');
  firstBtn.onclick=function(){
    alert('Hello World!');
  };
  fristBtn.onclick=function(){
    alert('Hello World!!!');
  }; // 한 번만 실행됨!
</script>

- addEventListener() : 1개 이상의 이벤트가 가능하고, IE9이상 동작함.

<button id="firstBtn2">click</button>
// 프로퍼티 방식과 달리 onclick이 없다

<script>
  let firstBtn2 = document.querySelector('#firstBtn2')
  function testFunc(){
    alert('Hello World!');
  }
  firstBtn2.addEventListener('click', testFunc);
  firstBtn2.addEventListener('click', Function(){
    alert('Hello World!!!');
  }
  // "on"이 붙은 이벤트를 사용하지 않는다. onclick아닌 click
</script>

3. 해제 방법

- onclick의 경우 이벤트를 null로 만듦

- removeEventListener() 사용

 

4. 이벤트 버블링 

- 정의 : 이벤트 발생시 요소에 할당된 핸들러 동작 후 최상단 요소를 만날 때까지 부모 요소 핸들러를 동작하는 것.

-> 중단법 : event.stopPropagation()을 사용해 위쪽 핸들러를 막을 수 있으나 다른 핸들러 동작을 막지는 못함.

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')">P</p>
  </div>
</form>

-> 그래서, event.stopImmediatePropagation()을 사용함.

 

5. 이벤트 캡쳐링 

- 정의 : 버블링과 반대로 하위 요소에 이벤트를 전파하는 것.

- 탐색할 때 사용한다.

elem.addEventListener(..., {capture:true})
elem.addEventListener(..., true)

// 제거
elem.removeEventListener(..., true)

6. 이벤트 위임

- 정의 : 하나의 부모에 이벤트를 등록해 부모가 이벤트를 위임하는 방식

- 상위 요소에서 하위요소의 이벤트 제어 -> 동적 요소들 처리하기 수월해짐. 이벤트 핸들러가 더 적게 등록됨

∴ 메모리 절약

- 하위 요소가 많으면 이벤트리스너 작업이 번거롭기 때문에 사용함.