2022년 시즌 이벤트 모달창을 개발하던 중이었다.
개발을 하면서 페이지로 이동할 때마다 열리는 모달창 때문에 사용자 경험 측면에서 조금 거슬릴 것 같다고 생각을 했다.
디자인 시안과 기획안 모두에 "오늘 하루 동안 이 창을 열지 않음"이라는 기능은 없었지만!!!
기획팀에 해당 기능 추가에 대한 의견을 남기어 개발하게 되었다.
해당 프로젝트는 레거시 코드이기 때문에 라이브러리(리액트, 뷰, 앵귤러 등)를 사용하지 않고 순수 자바스크립트로만 개발하였다.
<div id="parent">
<div class="modalWrap" onclick="closeModal()"></div>
<div id="modal">
<button onclick="closeModalDuringOneday()">오늘 하루 동안 이 창을 열지 않음</button>
</div>
</div>
const getCookie = (name) => {
const value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return value ? value[2] : null;
}
const closeModal = () => {
document.querySelector('div.modalWrap').style.display = 'none';
const modal = document.getElementById('modal');
document.querySelector('#parent').removeChild(modal);
}
const closeModalDuringOneday = () => {
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = `modalClose=T; expires=${date}`
closeModal();
}
(function() {
if (getCookie('modalClose')) closeModal();
}());
name
이 있는지 확인한다.name
에 value
가 있다면 value[2]
에 우리가 지정한 document.cookie에서 name
의 value
값이 나온다.date
값을 생성하며, document.cookie의 expires(만료) 값이 된다. 이때 주의할 점은 toUTCString
혹은 toGMTString
메서드를 사용하여 포맷을 변경해 주어야 브라우저 쿠키에서 정상 동작하며, 브라우저는 설정된 유효 일자까지 쿠키를 유지하다가 해당 일자가 도달하면 쿠키를 자동으로 삭제한다.key=value
뒤에 나열하고 ;
로 구분한다.popupClose(name)
값이 있는지 확인하여 모달을 띄울 지 말지 판별하여 동작하여야 하는데, react의 useEffect
같은 기능을 사용할 수 없기에, 처음엔 window.onload
안에서 실행되도록 했는데, 이슈사항은 말 그대로 dom이 다 로드되었을 때 동작하기 때문에 사용자 측면에서 매우 느리고, 모달이 처음엔 켜져 있다가 브라우저 쿠키의 값을 보고 꺼지기 때문에 오류처럼 보인다는 것이다. 따라서 어떤 방법이 있을까 고민하다, 생각보다 정말 간단하게 브라우저에서 해당 프로젝트 코드를 읽을 때 바로 실행할 수 있는 즉시실행함수로 동작하게 하면 되겠다는 생각을 하여 적용해 보았고, 생각했던 대로 정상 동작하였다. (주절주절)혹시 내용에 오류가 있다면 피드백 부탁드립니다. 🙇🏻♀️
[참고]