이벤트 버블링 : 특정 요소에 이벤트가 발생했을 때 해당 이벤트가 그 요소의 조상들에게까지 전달되는 현상
이벤트 흐름 순서
이벤트가 발생하면 1. 캡쳐링 단계 → 2. 타켓 단계 → 3. 버블링 단계가 일어난다
1. 캡쳐링 단계
브라우저는 이벤트가 발생한 좌표를 알아낸다. (이벤트 타겟 프로퍼티는 이벤트 발생 위치를 담고 있다.)
그럼 그 좌표에서 제일 깊이 있는 요소를 타겟 이라고 하고
윈도우부터 타겟을 찾아 들어가는 동안 만나는 요소들(=타겟의 부모 요소들)에게 이벤트 리스너가 있는지 확인한다.
- 이벤트 리스너가 없는 경우 : pass
- 이벤트 리스너가 있는 경우 : 캡쳐 사용 여부를 확인한다
캡쳐 사용 여부가 true인 경우에만 캡쳐링 단계에서 이벤트 리스너를 실행시킨다 (그 외는 버블링 단계에서..)
*캡쳐링 단계에서 이벤트 발생시키는 방법
addEventListener 세번째 아규먼트에 true 또는 {capture:true} 전달
2. 타겟 단계
타켓에서 이벤트 리스너를 실행시킨다.
3. 버블링 단계
다시 최상위 객체까지 거슬러 올라간다.
다시 만나는 부모 요소들 중 (캡쳐링 단계에서) 이벤트 리스너가 있음을 확인한 요소들의 이벤트 리스너를 실행시킨다.
*버블링을 막는 메서드 : event.stopPropagation()
상위 범위에서 이벤트를 발생시켜야할때 해당하는 범위만 이벤트 결과를 얻지 못하게 될 수 있어서 사용을 지양한다.
▼예시 참조하기
https://velog.io/@moonheekim0118/JavaScript-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81
[JavaScript] 이벤트 위임
자바스크립트 코드 내 이벤트 버블링과 캡쳐링을 이해한다.이벤트 위임 패턴을 이해한다.이벤트 위임이 무엇인지 알기위해서는 먼저 이벤트 버블링과 캡쳐링이 무엇인지 알아야한다.특정 엘리
velog.io
버블링을 활용한 이벤트 위임 Delegation : 공통 조상에 이벤트핸들러 하나만 사용해도 여러 요소에 적용을 할 수 있음
⇔ 여러 요소에 이벤트 처리를 할때, 각각에 이벤트 리스너를 등록하기 : 비효율적임
<ul id="menu">
<li><button id="file">파일</button></li>
<li><button id="edit">편집</button></li>
<li><button id="view">보기</button></li>
</ul>
document.getElementById("file").addEventListener("click", function(e) {
// 파일 메뉴 동작
});
document.getElementById("edit").addEventListener("click", function(e) {
// 편집 메뉴 동작
});
document.getElementById("view").addEventListener("click", function(e) {
// 보기 메뉴 동작
});
//이벤트 위임을 사용한 코드
document.getElementById("menu").addEventListener("click", function(e) {
var target = e.target;
if (target.id === "file") {
// 파일 메뉴 동작
} else if (target.id === "edit") {
// 편집 메뉴 동작
} else if (target.id === "view") {
// 보기 메뉴 동작
}
});
https://ui.toast.com/weekly-pick/ko_20160826
왜 이벤트 위임(delegation)을 해야 하는가?
과거 웹오피스의 워드를 개발했던 때에, 각주 기능을 개발했던 적이 있다. 문서의 특정 부분에 커서를 두고 "각주"를 추가하면 해당 부분에 대한 코멘트를 문서의 우측 영역에 작성할 수 있는 기
ui.toast.com
'개발 공부 일지 > JavaScript' 카테고리의 다른 글
[위클리페이퍼 4주차] (0) | 2024.07.26 |
---|---|
자바스크립트 - this (0) | 2024.07.26 |
document.querySelectAll은 항상 Nodelist를 반환한다 (0) | 2024.07.26 |
자바스크립트 - Promise (2) | 2024.07.23 |
자바스크립트 - 비동기 함수, 콜백 함수 (1) | 2024.07.23 |