팝업창 오늘하루 그만보기 만들기
in Javascript on Javascript, jQuery
오늘 하루 그만보기 기능을 만들려면 쿠키를 써야 한다. 쌩으로 써도 되지만 분명히 누군가 쉽게 쓸 수 있도록 만들어 놓은것이 있을거라서 구글에서 javascript cookie 로 검색해 본다.
검색 결과 제일 상단에 나오는 js-cookie 라는 것을 가져다가 쓰면 될 것 같다.
라이브러리 설치
<script src="//cdn.jsdelivr.net/npm/js-cookie@2.2.0/src/js.cookie.min.js" />
jQuery 로 하면 더 쉽고 짧게 만들수도 있겠지만 이상하게 요즘 jQuery 를 잘 안쓰는 추세가 있기 때문에 유행에 발맞춰 순수 자바스크립트로 작성해 보았다.
jQuery 로 맨든 버전은 죠아래 스크롤 내려보면 있음
일단 전체소스는 아래와 같다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<script src="//cdn.jsdelivr.net/npm/js-cookie@2.2.0/src/js.cookie.min.js"></script>
<style>
.popup_layer {
/* 초기 로딩시 팝업창은 닫힌 상태로.. 쿠키에 없는 경우만 다시 보이게 처리할거임 */
display: none;
border: 1px solid #222222;
}
.popup_close_btn {
position: absolute;
bottom: 0px;
}
</style>
</head>
<body>
<div data-popup-id="popup_test1" class="popup_layer">
팝업창1
<div class="popup_close_btn">
<button class="close_with_cookie" data-expired="1">하루동안 안볼래염</button>
<button class="close_with_cookie" data-expired="365">계속 안볼래염</button>
</div>
</div>
<div data-popup-id="popup_test2" class="popup_layer">
팝업창2
<div class="popup_close_btn">
<button class="close_with_cookie" data-expired="1">하루동안 안볼래염</button>
<button class="close_with_cookie" data-expired="365">계속 안볼래염</button>
</div>
</div>
<script>
// html 이 다 로딩된 후에 실행함
document.addEventListener('DOMContentLoaded', function() {
// popup_test1 레이어 팝업을 300 x 500 크기로 위에서 10 왼쪽에서 10 위치에 띄운다.
layerPopup('popup_test1', '10px', '10px', '300px', '500px');
// popup_test1 레이어 팝업을 600 x 300 크기로 위에서 10 왼쪽에서 320 위치에 띄운다.
layerPopup('popup_test2', '10px', '320px', '600px', '300px');
// 안볼래염 버튼 클릭했을때
var btns = document.querySelectorAll('.close_with_cookie');
for (var i = 0, length = btns.length; i < length; i++) {
btns[i].addEventListener('click', function() {
// html 에 설정된 팝업창 아이디와 언제까지 닫을지(expired) 값을 가져온다.
var popup = this.parents('[data-popup-id]')[0];
var id = popup.getAttribute('data-popup-id');
var expired = parseInt(this.getAttribute('data-expired') || '1');
// 쿠키가 언제까지 유지될지 설정한 다음에 팝업창을 닫는다.
Cookies.set(id, 'popup_closed', { expires: expired });
popup.style.display = 'none';
});
}
function layerPopup(id, top, left, w, h) {
// 팝업창 id로 저장된 쿠키가 없으면 팝업창 보여주기
if (!Cookies.get(id)) {
var popup = document.querySelector('[data-popup-id="' + id + '"]');
popup.style.position = 'absolute';
popup.style.top = top;
popup.style.left = left;
popup.style.width = w;
popup.style.height = h;
popup.style.display = 'block';
}
}
Element.prototype.parents = function(selector) {
var elements = [];
var elem = this;
var ishaveselector = selector !== undefined;
while ((elem = elem.parentElement) !== null) {
if (elem.nodeType !== Node.ELEMENT_NODE) {
continue;
}
if (!ishaveselector || elem.matches(selector)) {
elements.push(elem);
}
}
return elements;
};
});
</script>
</body>
</html>
차근차근 맹글어 보기
- 팝업창 div 를 display:none 으로 설정해서 팝업창을 처음부터 안보이는 상태로 맹글어 둔다.
<style>
.popup_layer {
/* 초기 로딩시 팝업창은 닫힌 상태로.. 쿠키에 없는 경우(안볼래염 버튼 클릭전 팝업)만 다시 보이게 처리할거임 */
display: none;
border: 1px solid #222222;
}
.popup_close_btn {
position: absolute;
bottom: 0px;
}
</style>
<!-- data-popup-id 에 겹치지 않게 원하는 팝업창 아이디 설정 -->
<div data-popup-id="popup_test1" class="popup_layer">
팝업창1
<div class="popup_close_btn">
<button class="close_with_cookie" data-expired="1">하루동안 안볼래염</button>
<button class="close_with_cookie" data-expired="365">계속 안볼래염</button>
</div>
</div>
<div data-popup-id="popup_test2" class="popup_layer">
팝업창2
<div class="popup_close_btn">
<button class="close_with_cookie" data-expired="1">하루동안 안볼래염</button>
<button class="close_with_cookie" data-expired="365">계속 안볼래염</button>
</div>
</div>
- 팝업창 아이디로 저장된 쿠키가 없으면 팝업창이 보이게 하는 팝업창 띄우는 함수를 만든다.
function layerPopup(id, top, left, w, h) {
// 팝업창 id로 저장된 쿠키가 없으면 팝업창 보여주기
if (!Cookies.get(id)) {
var popup = document.querySelector('[data-popup-id="' + id + '"]');
popup.style.position = 'absolute';
popup.style.top = top;
popup.style.left = left;
popup.style.width = w;
popup.style.height = h;
popup.style.display = 'block';
}
}
- 하루동안 안볼래염 버튼을 클릭했을때 해당 팝업창 아이디로 쿠키에 대충 아무 값이나 저장한다.
// 안볼래염 버튼 클릭했을때 처리하기
// 클래스가 close_with_cookie 인 엘리먼트들 가져옴
var btns = document.querySelectorAll('.close_with_cookie');
// 하나씩 반복하면서 클릭 이벤트가 발생했을때 할 일을 정의한다.
for (var i = 0, length = btns.length; i < length; i++) {
btns[i].addEventListener('click', function() {
// html 에 설정된 팝업창 아이디와 언제까지 닫아 둘지(expired) 설정한 값을 가져온다.
var popup = this.parents('[data-popup-id]')[0];
var id = popup.getAttribute('data-popup-id');
// data-expired 설정한 값이 없다면 디폴트값으로 하루를 설정한다.
var expired = parseInt(this.getAttribute('data-expired') || '1');
// 쿠키가 언제까지 유지될지 설정한 다음에 팝업창을 닫는다.
Cookies.set(id, 'popup_closed', { expires: expired });
popup.style.display = 'none';
});
}
// jQuery parents 함수구현
Element.prototype.parents = function(selector) {
var elements = [];
var elem = this;
var ishaveselector = selector !== undefined;
while ((elem = elem.parentElement) !== null) {
if (elem.nodeType !== Node.ELEMENT_NODE) {
continue;
}
if (!ishaveselector || elem.matches(selector)) {
elements.push(elem);
}
}
return elements;
};
- 팝업창 띄우기
// popup_test1 레이어 팝업을 300 x 500 크기로 위에서 10 왼쪽에서 10 위치에 띄운다.
layerPopup('popup_test1', '10px', '10px', '300px', '500px');
// popup_test1 레이어 팝업을 600 x 300 크기로 위에서 10 왼쪽에서 320 위치에 띄운다.
layerPopup('popup_test2', '10px', '320px', '600px', '300px');
jQuery 버전으로 맨들때는 요렇게 맨들 수 있다
$(document).ready(function() {
// popup_test1 레이어 팝업을 300 x 500 크기로 위에서 10 왼쪽에서 10 위치에 띄운다.
layerPopup('popup_test1', '10px', '10px', '300px', '500px');
// popup_test1 레이어 팝업을 600 x 300 크기로 위에서 10 왼쪽에서 320 위치에 띄운다.
layerPopup('popup_test2', '10px', '320px', '600px', '300px');
// 안볼래염 버튼 클릭했을때
$('.close_with_cookie').on('click', function() {
var popup = $(this).parents('[data-popup-id]');
var id = popup.data('popup-id');
var expired = parseInt($(this).data('expired') || '1');
Cookies.set(id, 'popup_closed', { expires: expired });
popup.hide();
});
function layerPopup(id, top, left, w, h) {
// 팝업창 id로 저장된 쿠키가 없으면 팝업창 보여주기
if (!Cookies.get(id)) {
$('[data-popup-id="' + id + '"]')
.css({
position: 'absolute',
top: top,
left: left,
width: w,
height: h
})
.show();
}
}
});