본문 바로가기

블록체인_9기/💛 JAVASCRIPT

17강(과제X)_230324_Javascript(쿠키, setCookie, getCookie, document.cookie, toUTCString, trim, startsWith, setInterval, clearInterval)

728x90

 

 

 

 


쿠키 (Cookie)

  • 쿠키와 로컬스토리지의 type은 string으로 표시된다.
  • 쿠키값이 없을 경우의 type은 undefined로 확인된다.
    • 사용자가 일부러 쿠키 값을 없애거나 지정된 쿠키 시간이 종료되면 쿠키값이 사라진다.
let popupEvent = document.querySelector('.event-btn'); 

popupEvent.addEventListener("click",function(){
    setCookie("event-popup",true,10);
})


console.log(typeof getCookie("event-popup"))
//태그 popupEvent가 가리키는 버튼을 클릭하기 전: undefined
//태그 popupEvent가 가리키는 버튼을 클릭한 후: string

 

 

document.cookie

  • html에 관련된 쿠키를 읽거나 쓸 수 있다.
  • key = value 의 방법을 사용하면 한 번에 하나의 쿠키만 설정하거나 업데이트 할 수 있다.
//새 쿠키 쓰기
//key = value
document.cookie = newCookie;

 

 

 

 


setCookie / getCookie

setCookie(name, value, options)

  • 현재 경로(path=/)를 기본으로, 주어진 name value를 가진 쿠키를 설정(다른 기본값을 추가할 수 있다)

getCookie(name)

  • 주어진 name의 쿠키를 반환한다.

 

 

 

 


toUTCString

  • 날짜를 문자열로 변환하여 UTC 시단대로 해석한다.
  • 반환값은 Www, dd Mmm yyyy hh:mm:ss GMT 형식으로 표현된다.
    • Www: 요일, 세 글자로 표현 예) Sun, Mon
    • dd: 일단위, 필요한 경우 선두가 0인 두 자리 숫자로 표현 예) 06, 31
    • Mmm: 달, 세 글자로 표현 예) Jan, Feb
    • yyyy: 연도, 필요한 경우 선행 0 이 포함된 네 자리 이상의 숫자로 표현
    • hh: 시간, 필요한 경우 선두가 0인 두 자리 숫자로 표현
    • mm: 분, 필요한 경우 선두가 0인 두 자리 숫자로 표현
    • ss: 초, 필요한 경우 선두가 0인 두 자리 숫자로 표현

 

 

 

 


trim( )

  •  문자열 양 끝의 공백을 제거하고 원본 문자열을 수정하지 않고 새로운 문자열을 반환다. 
    • 공백이란, 모든 공백문자(space, tab, NBSP 등)와 모든 개행문자(LF, CR 등)를 의미한다.
  • 블록 끝의 블록만 제거한 새로운 문자열을 반환하려면 trimStart()또는 trimEnd()사용
    • trimStart(): 문자열 시작부분의 공백을 제거
      • trimLeft()라는 별칭으로 호출이 가능
    •  trimEnd(): 문자열 끝부분의 공백을 제거
      • trimRight() 라는 별칭으로 호출이 가능

 

 

 

 


startsWith()

  •  특정 문자열이 특정 문자로 시작되는지 확인하여 결과 값을 true로 반환하거나, false로 반환한다.
  • startsWith(searchString, position)
    • searchString(첫 번째 매개변수): 문자열의 시작점에서 탐색할 문자열.
    • position(두 번째 매개변수): searchString을 탐색할 위치이다. (인덱스 값)
const str1 = 'Saturday night plans';

console.log(str1.startsWith('Sat'));
//결과: true

console.log(str1.startsWith('Sat', 3));
//결과: false

console.log(str1.startsWith('night', 9));
//결과: true
 

 

 

 


setInterval()

  • 주기적으로 인자를 실행하는 함수이다.
  • 함수 호출을 중단하려면 clearInterval()을 사용하면 된다.
//Hello!라는 문자열을 콘솔에 3초에 1번씩 실행합니다.
function test() {
  console.log("Hello!");
}
setInterval(test, 3000);

 

 

 

 


clearInterval()

  •  현재 진행되고 있는 함수의 진행을 멈추는데 사용한다.
// 2초 간격으로 메시지를 보여줌
let timerId = setInterval(() => alert('째깍'), 2000);

// 5초 후에 정지
setTimeout(() => { clearInterval(timerId); alert('정지'); }, 5000);

 

 

 

 

 👩‍🏫예시_쿠키 생성 팝업창

  • 팝업창에 있는 클릭 버튼을 click하면 지속시간이 10초인 쿠키 생성.
  • 새로고침하면 열려있던 팝업창이 없어지고 쿠키의 남은 시간을 html에서 확인할 수 있다.
  • 쿠키의 지속시간이 종료되고 다시 새로고침을 누르면 이전에 보였던 팝업창이 다시 생기게 된다.
//HTML의 span태그의 클래스인 popup-btn을 가리킴 (팝업창 내 우측상단 X)
let popupBtn = document.querySelector(".popup-btn");
//HTML의 button태그의 클래스인 event-btn을 가리킴 (팝업창 내 좌측 상단 '클릭'버튼)
let popupEvent = document.querySelector('.event-btn'); 
//setCookie로 생성된 쿠키 event-popup을 가리킨다.(쿠키의 유지시간을 지정하는 쿠키)
let popupCookie = getCookie("event-popup");

function popupOpen(){       // 함수 popupOpen 선언. 팝업창의 노출여부를 결정하는 함수
    //팝업창을 감싸는 div영역인 popup-wrap을 가리킴
    let popup = document.querySelector('.popup-wrap');
    //'is-on'클래스를 생성하여 is-on의 유무에 따라 팝업창 노출, 비노출 실행진행

    //변수popup이 가리키는 태그의 클래스에 'is-on'이 있으면 참, 없으면 거짓
    if(popup.classList.contains("is-on")){
        //변수 popup에 클래스'is-on'이 있으면 클래스를 지워 비노출로 변경한다.
        popup.classList.remove('is-on');
    }else{
        //변수 popup에 클래스'is-on'이 없으면 클래스를 추가해 노출로 변경한다.
        popup.classList.add('is-on');
    }
}
//태그 popupBtn의 이벤트 구독. popupBtn를 click하면 함수 popupOpen 실행
//팝업창 내 X 버튼을 클릭하면 is-on class가 지워지며 팝업창이 사라진다.
popupBtn.addEventListener("click",popupOpen);


//태그 popupEvent의 이벤트 구독. popupEvent를 click하면 익명함수 실행
popupEvent.addEventListener("click",function(){
    console.log('이벤트');
    // setCookie('설정할 이름',설정할 값, 설정할 기간)
    // setCookie를 이용하여 쿠키 추가
    // event-popup이라는 이름의 쿠기 생성. 이 쿠키는 true 값을 가지고 10초의 시간을 갖는다.
    setCookie("event-popup",true,10);
})

/* popupEvent태그를 눌러서 popupEvent의 익명함수가 실행되면 실행되기 전에는
    undefined 타입이었지만, 실행 후에는 string으로 변경되어 표시된다.
    따라서, event-popup의 타입은 string이다.*/
// 쿠키, 로컬스토리지 둘 다 문자로 저장된다.
// 코딩을하면서 데이터를 저장할때 문자열로 저장한다.
console.log(typeof getCookie("event-popup"))
// 하루동안 팝업 안보이기

/* 쿠키값이 없다 == undefined. 사용자가 일부러 쿠키값을 없애거나,
    event-popup에서 지정된 쿠키시간이 종료되면 쿠키값이 사라진다. */
// 쿠키값이 없으면 popupOpen함수가 작동하여 팝업이 뜨도록 한다.
if(popupCookie == undefined)
{
    popupOpen();
}

// 함수 getCookie 선언. (인터넷에서 불러옴)
function getCookie(c_name)
{
   var i,x,y,ARRcookies=document.cookie.split(";");
   for (i=0;i<ARRcookies.length;i++)
   {
     x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
     y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
     x=x.replace(/^\s+|\s+$/g,"");
     if (x==c_name)
     {
       return unescape(y);
     }
   }
}
// 함수 setCookie 선언.
function setCookie(c_name,value,time){
    /*변수 date선언. 
        new Date에 매개변수를 제공하지 않으면 생성한 순간의 날짜와 시간을 나타내는
        Date 객체를 생성한다. */
    let date = new Date();
    
    /* popupEvent 클릭 시 동작하는 익명함수에서의 선언문 setCookie("event-popup",true,10);
        'date.setTime'에 'date.getTime()'으로 'event-popup'을 받고,
        'value'값을 'true'로 받고 'time'값을 '10'으로 받는다. */
        
    /* 따라서, 'date.setTime'은 'event-popup'으로 값을 받고, 지속시간(1000 == 1초)은
        '10 * 1000'이므로 10초 동안의 지속시간이 주어진다. */
    date.setTime(date.getTime() + time * 1000);

    let str = c_name+"="+value+";expires="+date.toUTCString()+";path=/";
    let str2 = getCookieTime(str);
    // 문자열로 데이터를 저장하는데
    // 값이 여러개일경우
    // 배열이라던지 객체를 사용
    // 여러가지의 값을 사용해야하기때문에 객체의 모양으로 문자열을 전달하고
    // 문자열을 받아서 객체로 변환하여 사용하자.
    console.log(getCookieTime(c_name+"="+value+";expires="+date.toUTCString()+";path=/"));
    document.cookie = c_name+"="+`{"value" : "${value}", "time" : "${str2}"}`+";expires="+date.toUTCString()+";path=/"
    let value2 = getCookie("event-popup");
    console.log(JSON.parse(value2));
}
//함수 getCookieTime 선언. 'setCookie'쿠키 내에서 매개변수를 받아 실행된다.
function getCookieTime(cookie){
    // 지역변수 str선언. 쿠키 문자열을 받아서 ';'부분마다 잘라 배열로 변환
    let str = cookie.split(';');
    let str2 = str.find(function(i){
        let temp = i.trim();
        return temp.startsWith('expires=');
    })
    if(str2){
        let str3 = str2.trim();
        console.log(str3);
        // 쿠키의 시간을 받아서 시간의 정보들을 다루는 
        // Date객체를 만들어줬다.
        return new Date(str3);
    }else{
        return null;
    }
}

// trim 메소드 : 문자열 양끝의 공백을 제거
let a = "    a b     ";
console.log(a);
console.log(a.trim());

// startsWith 메소드 : 해당 문자로 시작하는지 여부
// 매개변수로 시작하는 문자열 전달해주면 된다.

let b = "abcd";
console.log(b.startsWith("abc"))


// 시간의 차이를 구해서 값을 받아보자
// 밀리초를 받아서 시간이 얼마나 남은건지 확인하는 함수
// 시간계산을 할때 언제 시간이 만료되는지 알고있으면 되는거죠?
// 지금 시간의 정보를 가지고있는 Date객체를 만들어서
// 미래 시간의 밀리초와 지금 만든 Date객체의 밀리초를 빼면
// 차이값이 나오는데 그 차이값(밀리초)를 가지고 날짜와 시간과 분,초 이렇게 나타내주기만 하면 된다.
// times함수로 밀리초를 가지고 날짜 시간 분 초가 얼마나 남은건지.
let dateTemp = 1000;


// 비동기 함수 setTimeout이 함수는 매개변수로 전달한 시간이후에 실행되는 함수.
// setTimeout(() => {
//     // 1초뒤에 실행
// }, 1000);

// 비동기 함수
// 매초마다 동작하는 함수를 만들어보자
// 정한 시간마다 동작하는 함수
// 매개변수로 전달한 시간마다 동작한다.
// let date1 = new Date();
// date1.setTime(date1.getTime() + 100000);
// let time = JSON.parse(popupCookie).time;
// let date = new Date(time);
//console.log(date);
// setInterval 제거 방법
let setTime = setInterval(() => {
    let date2 = new Date();
    // // 값이 들어온것 객체가 아니고
    // let time = date1.getTime() - date2.getTime();
    // // 1초마다 실행
    // times(time);
    let timeTag = document.querySelector('.popup-time');
    if(popupCookie != undefined)
    {
        let time = JSON.parse(popupCookie).time;
        let date = new Date(time);
        console.log(date);
        console.log(date2);
        console.log(popupTime(date,date2));
        timeTag.innerHTML = times(popupTime(date, date2));
    }else{
        timeTag.innerHTML = "시간끝";
    }
}, 1000);

function popupTime(date1,date2) {
    return date1.getTime() - date2.getTime();
}

function times(time){
    // let sec = Math.floor(time / (24*60*60*1000));
    // let min = Math.floor(time / (60*60*1000));
    // console.log(min);
    let day = Math.floor(time / (24 * 60 * 60 * 1000));
    // 받아온 시간에서 날짜가 하루 단위가 있으면 나눠서 값을 넣어주고
    // 일단위를 빼고
    time %= (24 * 60 * 60 *1000);
    let hour = Math.floor(time / (60 * 60 * 1000));
    // 시간단위를 빼고
    time %= (60 * 60 * 1000);
    let min = Math.floor(time /(60 * 1000));
    // 분단위를 다빼고
    time %= (60 * 1000)
    // 남은 초
    let sec = Math.floor(time / 1000);
    console.log(day);
    console.log(hour);
    console.log(min);
    console.log(sec);
    if(time < 0)
    {
        // 지울 Interval 함수 매개변수로 전달하면된다.
        clearInterval(setTime);
        let timeTag = document.querySelector('.popup-time');
        timeTag.innerHTML = "";
    }
    return `${day}일 ${hour}시 ${min}분 ${sec}초`;
}

//

 

 

 

 

 

 

728x90