이벤트(event)란 프로그래밍하고 있는 시스템에서 일어나는 사건(action) 혹은 발생(occurrence)으로, 원한다면 그것들에 응답할 수 있도록 시스템이 말해주는 것이다.
시스템은 이벤트가 발생될 때 신호를 발생시키고, 이벤트가 발생되었을 때 사건이 자동적으로 취할 수 있는 매커니즘(코드)를 제공한다.
각각의 이벤트들은 이벤트 핸들러(event handler)를 갖고 있는데, 이는 이벤트가 발생하면 실행되는 코드 블럭이다.
event
, evt
, e
같은 이름으로 명명된 매개변수(parameter)들을 이벤트 객체라고 부른다.
<html>
<body>
<div class="depth1" onClick="alert('depth1')">
<!--depth1-->
<div class="depth2" onClick="alert('depth2')">
<!--depth2 > depth1-->
<div class="depth3" onClick="alert('depth3')">
<!--depth3 > depth2 > depth1-->
</div>
</div>
</div>
</body>
</html>
focus
과 같은 일부 이벤트는 버블링되지 않는다.event.stopPropagation()
을 사용하면 버블링을 강제로 중단시킬 수 있다.
event.stopImmediatePropagation()
을 사용해야 한다.이벤트 객체의 target
프로퍼티는 이벤트가 발생한 가장 안쪽의 요소에 대한 참조이다.
event.target
은 실제 이벤트가 시작된 요소이다. 버블링이 진행되어도 변하지 않는다.this(event.currentTarget)
는 현재 요소이다. 현재 실행 중인 핸들러가 할당된 요소를 참조한다.이벤트 캡처링(Event Capturing)은 window부터 이벤트가 발생한 요소까지 이벤트를 전파한다.
이벤트 흐름은 캡쳐링 단계
, 타깃 단계
, 버블링 단계
의 3가지 단계로 정의된다.
이벤트가 아래로 전파되고, 이벤트가 타깃 요소에 도착해 실행된 후에, 다시 위로 전파되며 이벤트 핸들러가 호출된다.
elem.addEventListener(..., {capture: true})
를 설정해야 한다. default 값은 false
이며, 핸들러는 버블링 단계에서 동작한다.이벤트 캡쳐링과 버블링을 이용해 이벤트 위임(event delegation)을 구현할 수 있다.
이벤트 위임은 비슷한 방식으로 여러 요소를 다뤄야 할 때 사용된다. 요소마다 핸들러를 할당하지 않고, 요소의 공통 조상에 이벤트 핸들러를 하나만 할당해서 여러 요소를 한꺼번에 다룰 수 있다.
이벤트 위임은 다음과 같은 방식으로 동작한다.
event.target
을 사용해 이벤트가 발생한 요소가 어디인지를 알아낸다.많은 핸들러를 할당하지 않아도 되기 때문에 초기화가 단순해지고 메모리가 절약된다.
요소를 추가하거나 제거할 때 해당 요소가 할당된 핸들러를 추가하거나 제거할 필요가 없기 때문에 코드가 짧아진다.