Browser_Event_Delegation
#
이벤트 위임- 목표 :
<td>
를 클릭했을 때, 그 칸을 강조함 - 방법 :
onclick
핸들러를 할당할 요소 결정- 모든
<td>
마다 할당 👉 비효율적 - 모든 이벤트를 잡아내는 핸들러를
<table>
요소에 할당
- 모든
위 코드의 문제점
<td>
가 아닌<td>
안<strong>
에서는 동작하지 않는다.
elem.closest(selector)
- elem 의 상위 요소 중 selector 와 일치하는 가장 근접한 조상 요소를 반환
event.target
이<td>
안에 있지 않을 때,null
반환- 중첩 테이블이 있는 경우 event.target 은 현재 테이블 바깥에 있는
<td>
가 될 수도 있습니다. - 진짜 td를 강조
#
이벤트 위임 활용하기- (*)
elem.onclick = this.onClick.bind(this);
this.onClick
은this
에 바인딩함.- class 의 객체에서의 this 는 menu 의 인스턴스 object 를 가리킵니다.
- 바인딩 하지 않으면, onClick 메서드 안에서의 this 는 elem 이다.
#
이벤트 위임의 동작- 컨테이너에 하나의 핸들러를 할당합니다.
- 핸들러의 event.target 을 사용해 이벤트가 발생한 요소가 어디인지 알아냅니다.
- 원하는 요소에서 이벤트가 발생했다고 확인되면 이벤트를 핸들링합니다.
#
이벤트 위임의 장점- 요소를 추가하거나 제거할 때 해당 요소에 할당된 핸들러를 추가하거나 제거할 필요가 없기 때문에 코드가 짧아집니다.
- 동적인 엘리먼트에 대한 이벤트 처리가 수월하다.
- DOM 수정이 쉬워짐 : 상위 엘리먼트에서만 이벤트 리스너를 관리하기 때문에 하위 엘리먼트는 자유롭게 추가 삭제할 수 있다.
- 이벤트 핸들러 관리가 쉽다.
- 많은 핸들러를 할당하지 않아도 되기 때문에 초기화가 단순해지고 메모리가 절약됩니다.
- 메모리 누수 가능성도 줄어든다.
#
이벤트 위임의 단점- 이벤트 위임을 사용하려면 이벤트가 반드시 버블링 되어야 합니다.
- 버블링 되지 않는 일부 이벤트가 존재함.
- 낮은 레벨에 할당한 핸들러엔 event.stopPropagation()를 쓸 수 없습니다. (?TODO)
- 컨테이너 수준에 할당된 핸들러가 모든 하위 컨테이너에서 발생하는 이벤트에 응답해야함
- CPU 작업 부하가 늘어날 수 있습니다.
- 이런 부하는 무시할만한 수준이므로 실제로는 잘 고려하지 않음
#
예시- 카운터 구현하기
- 토글러 구현하기