DOM Level 3 Events : https://www.w3.org/TR/DOM-Level-3-Events/#event-flow
JavaScript Event 순서 : https://www.quirksmode.org/js/events_order.html#link4
https://developer.mozilla.org/ko/docs/Web/API/EventTarget/addEventListener
addEventListener(type, listener);
addEventListener(type, listener, options);
addEventListener(type, listener, useCapture);
이벤트 리스너의 특징을 지정할 수 있는 객체
capture (기본값 false)
once (기본값 false)
passive (기본값 false)
// signal (AbortSignal) - 실험 기술로 브라우저 호환성 확인 필요
지정한 AbortSignal 객체의 abort() 메서드를 호출하면 이 수신기가 제거됩니다.
명시하지 않을 경우 이벤트 수신기가 아무 AbortSignal에도 연결되지 않습니다.
useCapture
: 이벤트 대상의 DOM 트리 하위에 위치한 자손 EventTarget으로 이벤트가 전달되기 전에, 이 수신기가 먼저 발동돼야 함을 나타내는 불리언 값
: 캡처 모드인 수신기는 DOM 트리의 위쪽으로 버블링 중인 이벤트에 의해선 발동하지 않습니다.
: 참고: 이벤트의 대상에 부착된 수신기의 경우 캡처링도, 버블링 단계도 아닌 별도의 단계에 발동합니다.
: 캡처 모드의 수신기는 캡처 모드가 아닌 다른 모든 수신기보다 앞서 발동합니다.
https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent
new CustomEvent(type)
new CustomEvent(type, options)
options
https://developer.mozilla.org/en-US/docs/Web/API/Event/Event
bubbles
이벤트 버블 여부를 나타내는 부울 값
cancelable (기본값 false)
https://developer.mozilla.org/en-US/docs/Web/API/Event/cancelable
이벤트를 취소할 수 있는지 여부를 나타내는 부울 값
composed (기본값 false)
https://developer.mozilla.org/en-US/docs/Web/API/Event/composed
shadow DOM 경계를 넘어 표준 DOM으로 전파되는지 여부를 나타내는 부울 값 (예시 참고)
detail (read-only 속성) 추가 가능
https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail
Event.preventDefault();
이벤트를 취소할 수 있는 경우(event.cancelable을 사용하여 이벤트 취소 가능 여부 확인), 이벤트의 전파를 막지 않고 해당 이벤트를 취소
해당 이벤트만 취소하며, 상위 요소의 이벤트가 호출되는 것은 막지 않음
Event.stopPropagation();
이벤트 캡쳐링과 버블링에 있어 해당 이벤트 이후의 전파 막음
해당 이벤트의 상위 요소에 걸린 이벤트가 호출되지 않음
Event.stopImmediatePropagation();
해당 이벤트와 같은 레벨에 걸린 이벤트가 다른 리스너에서 불려지는 것을 막음
현재 이벤트와 같은 레벨에 걸린 이벤트를 취소하며, 상위 요소의 이벤트가 호출되는 것도 막음
https://ko.javascript.info/bubbling-and-capturing
한 요소에서 이벤트 발생 -> 이 요소에 할당된 핸들러 동작
-> 부모 요소의 핸들러 동작 (가장 최상단 조상 요소를 만날때 까지 반복되면서 요소 각각에 할당된 핸들러 동작)
이벤트 버블링은 타깃 이벤트에서 시작해서 요소를 거쳐 document 객체를 만날 때까지 각 노드에서 모두 발생합니다. 몇몇 이벤트는 window 객체까지 거슬러 올라가기도 합니다. 이 때도 모든 핸들러가 호출됩니다.
그런데 핸들러에게 이벤트를 완전히 처리하고 난 후 버블링을 중단하도록 명령할 수도 있습니다.
이벤트 객체의 메서드인 event.stopPropagation()를 사용하면 됩니다.
꼭 필요한 경우를 제외하곤 버블링을 막지 마세요!
버블링은 유용합니다. 버블링을 꼭 멈춰야 하는 명백한 상황이 아니라면 버블링을 막지 마세요. 아키텍처를 잘 고려해 진짜 막아야 하는 상황에서만 버블링을 막으세요.
실제 코드에서 자주 쓰이진 않지만, 종종 유용한 경우가 있으므로 알아봅시다.
표준 DOM 이벤트에서 정의한 이벤트 흐름엔 3가지 단계가 있습니다.
캡처링 단계 – 이벤트가 하위 요소로 전파되는 단계
타깃 단계 – 이벤트가 실제 타깃 요소에 전달되는 단계
버블링 단계 – 이벤트가 상위 요소로 전파되는 단계
이벤트 위임은 캡쳐링과 버블링을 이용한 것으로,
여러 엘리먼트마다 각각 이벤트 핸들러를 할당하지 않고, 공통되는 부모에 이벤트 핸들러를 할당하여 이벤트를 관리하는 방식이다
event.target
https://developer.mozilla.org/ko/docs/Web/API/Event/target
이벤트가 발생한 대상 객체
버블링과 캡처링 단계 event.currentTarget 과 다를 수 있습니다.
event.target 속성을 사용하여 이벤트 위임을 구현할 수 있습니다.
event.currentTarget
https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget
이벤트 핸들러가 부착된 객체
https://developer.mozilla.org/en-US/docs/Web/Events
데이터가 변경될 때 실행되는 다양한 이벤트 (change, input, cut, copy, paste)
https://ko.javascript.info/events-change-input#ref-537
dbclick