예전에 outside click 시 떠있는 modal, popup 등 없애기를 구현한 적이 있다 그때는 js 를 잘 다루지 못해서인지 아니면 정말 길게 코드를 작성하고 모달마다 팝업마다 해당 로직을 구현해 참 복잡하게 했던 기억이 있다.
하지만 조금 성장을 해서인가 ㅠㅠㅠ 사실 지금 좀 감동적이다. 진짜되서 와 이게 되네? 을 반복해서 했다.
이 코드가 e.stopPropagation();
를 사용해서 모든 상황에서 적용할 수 없을 수도 있지만 너무 간단하게 적용되기에 남겨보려 한다.
let currentShowingElement;
whenClickMakeSomethingVisibleElement.addEventListener('click', (e) => {
e.stopPropagation();
if (!!popupItem) popupItem.style.visibility = 'hidden';
currentShowingElement = visibledElement;
visibledElement.style.visibility = 'visible';
});
const body = document.querySelector('body');
body.addEventListener('click', () => {
if(!!currentShowingElement){
currentShowingElement.style.visibility = 'hidden';
currentShowingElement = ''
}
});
1-1. e.stopPropagation(); 를 설정하여 클릭이벤트가 버블링되어 body 태그까지 인직되지 않게한다.
주의 !! (만약 click 이벤트로 다른 요소에 focus 를 주고 그 focus 이벤트로 visibledElement에 visibility 를 변화시켜야하는경우 -> click 이벤트가 발생하는 요소에 e.stopPropagation(); 를 설정해주어야 함을 주의하자!)
1-2. 만약 페이지에 2개 이상의 요소가 visibledElement가 될 수 있다면 whenClickMakeSomethingVisibleElement 에 click 이벤트 콜백함수에서
if (!!popupItem) popupItem.style.visibility = 'hidden';
코드를 작성해주어 현재 popup 되어있는 요소를 없애고 1-3 을 작업해야한다.
(이 코드가 있어야 팝업 위에 팝업이 겹쳐지거나, 두번째 팝업만 닫히고 그전 팝업은 계속 살아있는 불상사가 생기지 않는다. => 한번에 한개의 popup 만 보이게 한다.)
1-3. whenClickMakeSomethingVisibleElement 에 click 이벤트 콜백함수에서 visibility 를 변화시킨 요소를 전역 변수 currentShowingElement에 넣는 코드를 추가로 작성한다.
조금의 성장이지만 성장을 느낄 수 있어 너무 감사한 코드였다!!! 계속 성장하고 있어!! 화이팅!!