류림스 공간
이벤트 버블링이란 / 이벤트버블링을 막는 방법 /이벤트버블링 활용 방법 본문
🤩 이벤트 버블링이란❓
🌱 이벤트 버블링은 특정 화면 요소에서 이벤트가 발생했을 때 해당 이벤트가 더 상위의 화면 요소들로 전달되어 가는 특성을 의미합니다.
HTML요소는 트리 형식으로 랜딩페이지에서 <Body />가 최상위 요소가 됩니다. 그 밑으로 자식 요소들이 있게 됩니다.
브라우저는 이벤트를 하위 컴포넌트에서 상위 컴포넌트로 전파시키는 방식을 뜻합니다.
이벤트 버블링이란 한 요소에 이벤트가 발생하면 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작하고 최상단의 부모 요소를 만날 때까지 반복되면서 핸들러가 동작하는 현상을 말합니다.
🤩 이벤트버블링을 막는 방법❓
🌱 event.stopPropagation()
이벤트의 전파를 원하지 않을 경우 이벤트 객체의 메서드인 event.stopPropagation()를 사용하면 됩니다.
아래 예시에서 <button>을 클릭해도 body.onclick은 동작하지 않습니다.
<body onclick="alert(`버블링은 여기까지 도달하지 못합니다.`)">
<button onclick="event.stopPropagation()">클릭해 주세요.</button>
</body>
다음과 같이 타겟의 이벤트 전파를 막을 수 있습니다.
-👩💻 한 요소의 특정 이벤트를 처리하는 핸들러가 여러개인 상황에서, 핸들러 중 하나가 버블링을 멈추더라도 나머지 핸들러는 여전히 동작합니다.
-👩💻 event.stopPropagation()은 위쪽으로 일어나는 버블링은 막아주지만, 다른 핸들러들이 동작하는 건 막지 못합니다.
-👩💻 버블링을 멈추고, 요소에 할당된 다른 핸들러의 동작도 막으려면 event.stopImmediatePropagation()을 사용해야 합니다.
-👩💻 이 메서드를 사용하면 요소에 할당된 특정 이벤트를 처리하는 핸들러 모두가 동작하지 않습니다.
-👩💻 버블링은 유용합니다. 버블링을 꼭 멈춰야 하는 명백한 상황이 아니라면 버블링을 막지 마세요. 아키텍처를 잘 고려해 진짜 막아야 하는 상황에서만 버블링을 막으세요.
-👩💻 event.stopPropagation()은 추후에 문제가 될 수 있는 상황을 만들어낼 수 있습니다.
🍄 문제가 발생할만한 시나리오를 살펴봅시다.
1️⃣ 중첩 메뉴를 만들었다 가정합시다. 각 서브메뉴(submenu)에 해당하는 요소에서 클릭 이벤트를 처리하도록 하고, 상위 메뉴의 클릭 이벤트 핸들러는 동작하지 않도록 stopPropagation을 적용합니다.
2️⃣ 사람들이 페이지에서 어디를 클릭했는지 등의 행동 패턴을 분석하기 위해, window내에서 발생하는 클릭 이벤트 전부를 감지하기로 결정합니다. 분석 시스템을 도입하기로 합니다. 그런데 이런 분석 시스템의 코드는 클릭 이벤트를 감지하기 위해 document.addEventListener('click'…) 을 사용합니다.
3️⃣ stopPropagation로 버블링을 막아놓은 영역에선 분석 시스템의 코드가 동작하지 않기 때문에, 분석이 제대로 되지 않습니다. 안타깝게도 stopPropagation을 사용한 영역은 죽은 영역(dead zone)이 되어버립니다.
-👩💻 이벤트 버블링을 막아야 하는 경우는 거의 없습니다.
-👩💻 버블링을 막아야 해결되는 문제라면 커스텀 이벤트 등을 사용해 문제를 해결할 수 있습니다.
-👩💻 핸들러의 event 객체에 데이터를 저장해 다른 핸들러에서 읽을 수 있게 하면, 아래쪽에서 무슨 일이 일어나는지를 부모 요소의 핸들러에게 전달할 수 있으므로, 이 방법으로도 이벤트 버블링을 통제할 수 있습니다.
🤩 이벤트버블링 활용 방법❓
🌱 하위 요소에 각각 이벤트를 붙이지 않고 상위 요소에서 하위 요소의 이벤트들을 제어하는 방식으로 이벤트 버블링을 활용할 수 있습니다.
이것을 이벤트 위임이라고도 말할 수 있습니다. 이벤트 버블링을 응용하여 부모 엘리먼트에 리스너를 위임하여 부착하면, 리스너의 개수를 1개로 줄여 최적화할 수 있습니다.
참고 블로그 : https://sangjuntech.tistory.com/22
'개발지식' 카테고리의 다른 글
새로운 CSS Flexbox나 Grid를 사용해본 적이 있나요? 있다면, 설명해보세요. (1) | 2022.06.21 |
---|---|
부모에서 자식으로 이벤트상속방법 (1) | 2022.06.08 |
메모이제이션이란? (0) | 2022.06.08 |
이벤트 위임 (0) | 2022.06.08 |
SEO란? (0) | 2022.06.07 |