본문 바로가기

블록체인_9기/💛 JAVASCRIPT

15강(과제X)_230322_Javascript(DOM트리, createElement( ), append( ), remove( ), addEventListener, Event, 쿠키, 로컬 스토리지, 세션 스토리지)

728x90

 

 

 


DOM 트리

 

DOM?

  • 문서 객체 모델
  • HTML, XML 문서의 프로그래밍 인터페이스이다.
  • 문서의 구조화된 표현을 제공하며, 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하며 그들이 문서구조, 스타일, 내용 등을 변경할 수 있게 돕는다.

 

 

  • 문서 객체 모델(DOM)에 따르면 모든 html태그는 객체이다.
  • 문서를 트리 구조의 형태로 표시하는 것이다.
  • 태그를 노드(node)라고 표현하고 노드를 연결하는 가지가 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <p>
            <h1></h1>
        </p>
    </div>
    <div>
        <span>
            <a href=""></a>
        </span>
    </div>
    
</body>
<script src="./index.js"></script>
</html>
  • 문자열을 태그사이에 넣어서 태그를 추가하는 방법
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="addTag"></div>
</body>
<script>
    document.querySelector('.addTag').innerHTML = "<div>태그추가</div>";
    //결과: 태그추가
</script>
</html>

 

 

 


createElement( )

 

  • javascript를 통해 동적으로 특정한 이름의 html의 element를 생성한다.
  • 태그를 생성해주는 메소드
  • element의 이름을 매개변수로 받아서 해당 노드를 생성한다.
  • element를 생성한 후에는 append, insert 메소드를 사용하여 삽입할 수 있으며, remove메소드를 사용하여 노드를 제거할 수 있고, replace메소드를 사용하여 노드를 교체할 수 있다.
  • 태그를 생성해서 원하는 위치에 노출할 수 았도록 append 메소드로 태그를 추가해줘야 확인이 가능하다.
    • append로 추가하기 전에는 메모리공간에 남아있다.
  • 문법: document.createElement(태그명);
  • javascript에서 생성한 태그에 내용을 넣을 수 있고, 클래스 추가도 가능하다.
    • 내용추가: 생성한 태그를 담은 변수명.innerHTML = "삽입할 내용";
    • 클래스추가: 생성한 태그를 담은 변수명.classList.add("추가할 클래스명");

 

 

 


append( )

 

  • 선택된 요소의 마지막에 새로운 요소나 콘텐츠를 추가한다.
  • append메소드는 원하는 요소에 태그를 추가할 수 있다.
  • 태그참조.append(생성한 태그)
    • 태그참조하고 태그의 내용으로 생성한 태그가 추가된다.
  • innerHTML, append 두 메소드 다 html에 내용을 추가하는데 차이점은 무엇일까?
    • innerHTML: 문자로 내용이 들어가서 보안에 취약하다.
    • append: DOM 트리의 노드이기 때문에 보안에 문제가 없다. 태그 작업을 세분화할 수 있다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="CEdiv"></div>
</body>
<script>
    //동적으로 태그를 생성
    let addDiv = document.createElement("div");     //동적으로 div태그를 생성하여 변수 addDiv에 담음
    let addP = document.createElement("p");         //동적으로 p태그를 생성하여 변수 addP에 담음

    addDiv.innerHTML = "div태그에 내용 추가!"       //생성한 div태그에 내용을 추가
    addP.innerHTML = "<p>p태그에 내용 추가!</p>"           //생성한 p태그에 내용과 스타일 추가

    addDiv.classList.add("adddiv");     // 생성한 div태그에 클래스 추가
    addP.classList.add("addp");     // 생성한 p태그에 클래스 추가

    document.body.append(addDiv);   //body 태그 영역에 생성한 div 태그 추가

    setTimeout(() => {
        document.querySelector('.CEdiv').append(addP); //html의 클래스CEdiv 영역에 생성된 태그 addP 추가.
    }, 2000);   //페이지가 전부 로드 된 후 2초 뒤 노출



    //태그의 내용을 전부 확인할 수 있다.
    //문자열로 쓴 태그의 텍스트 내용까지 전부 읽어준다.
    console.log(addDiv.innerHTML);  //결과: div태그에 내용 추가!
    console.log(addP.innerHTML);    //결과: <p>p태그에 내용 추가!</p>


    //태그의 내용에서 문자만 확인할 수도 있다.
    //innerText: 태그 사이의 문자만 가져온다.
    console.log(addDiv.innerText);      //결과: div태그에 내용 추가!
    console.log(addP.innerText);        //결과: p태그에 내용 추가!
</script>
</html>

 

 

 


remove( )

  • 원하는 태그를 제거할 수 있다.
  • DOM에서 원하는 노드를 메모리에서 삭제하고 종료한다.
  • 제거된 엘리먼트는 자바스크립트 엔진의 GC에 의해 곧 메모리에서 지워진다.

 

removeChild( )

  • 노드를 삭제한다는 개념보다는 메모리에 해당 노드는 그대로 존재하며, 부모-자식 관계를 끊어 DOM 트리에서 해제하는 것이다.
  • 최종적으로 관계를 끊은 해당 노드의 참조를 반환한다.
  • 반환값을 변수에 저장하지 않으면 삭제하는 노드의 참조가 더 이상 없기 때문에, 자바스크립트 엔진의 GC에 의해 잠시 후 메모리에서 삭제된다.
  • 반환된 노드 참조를 변수에 담아 다른 DOM 위치에 붙일 수 있다.
    • prepand( )를 이용하여 다시 DOM에 붙일 수 있다.
차이점 remove( ); removeChild( )
인터넷 익스플로러 미지원 지원
부모 엘리먼트 불필요 필요
반환값 없음 삭제한 노드 참조 변환
노드 리스트 삭제 미지원 미지원
하위 노드 삭제 지원 지원

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>없애봐!</p>
    <div>나는 div태그이고
        <h1>나는 제목이야</h1>
    </div>
    <button class="btn1"></button>
    <button class="btn2"></button>
</body>
<script>
    let JSbtn1 = document.querySelector('.btn1');     //태그 button의 클래스 btn1을 가리키는 변수 btn1
    let JSbtn2 = document.querySelector('.btn2');     //태그 button의 클래스 btn2을 가리키는 변수 btn2
    let JSp = document.querySelector('p');      //태그 p를 가리키는 변수 JSp
    let head1 = document.querySelector('h1');       //태그 h1을 가리키는 변수 head1
    let divJS = document.querySelector('div');      //태그 div를 가리키는 변수 divJS

    
    JSbtn1.innerHTML = "누르면 p태그 제거!"     //클래스 JSbtn1에 내용값 대입
    JSbtn2.innerHTML = "누르면 div태그 안에 h1태그 제거!"       //클래스 JSbtn2에 내용값 대입

    
    JSbtn1.onclick = function(){        //클래스 JSbtn1을 클릭하면 실행될 함수 선언
        JSp.remove();       //변수 JSp 태그 제거
    }
    //결과: p태그인 "없애봐!" 제거
    
    
    JSbtn2.onclick = function(){        //클래스 JSbtn2을 클릭하면 실행될 함수 선언
        console.log(head1);
        divJS.removeChild(head1);       //변수 head1을 변수 divJS에서 내용을 찾아 제거해준다.
        /* document.div.removeChild(head1);
            html에서 div태그를 찾아 그 내용에서의 변수 head1을 찾아서 제거하려 했으나 실패
            Uncaught TypeError: Cannot read properties of undefined (reading 'removeChild') */
    }
    //결과: h1태그인 "나는 제목이야" 제거
</script>
</html>

 

 

 


addEventListener

  • 이벤트를 구독시키는 함수
  • 이벤트를 등록하는 가장 권장되는 방식이다.
  • 이벤트를 실행시킬 객체.addEventListener("구독할 이벤트 이름", 실행시킬 함수( ){ })
  • onclick과 쓰임새가 비슷하나 몇가지의 차이점이 있다.
    • on을 빼고 작성한다.
      • 예) onscroll => scroll
    • 이벤트를 누적시킬 수 있다. 여러개의 이벤트 추가가 가능하다.
      • onclick의 경우에는 이벤트를 덮어쓰기 때문에 가장 마지막에 작성된 이벤트 단 한 개만 노출된다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button>구독하기</button>       //버튼태그 선언
</body>
<script>
    let btn = document.querySelector("button");     //태그 button을 가리키는 객체 btn 선언
    btn.addEventListener("click", function(){       //addEventListener 선언. 객체 btn이 가리키는 태그 클릭 시 실행될 함수 선언
        console.log("나는 이벤트 구독 중");
    })
    btn.addEventListener("click", function(){       //addEventListener 선언. 객체 btn이 가리키는 태그 클릭 시 실행될 함수 선언
        console.log("나는 이벤트 구독 중 2 ");
    })


    btn.onclick = function(){       //변수 btn을 클릭하면 실행되는 함수 선언.
        console.log("나는 onclick 1");
    }
    //단, 중복되어 선언되었기 때문에 해당 구문은 실행되지 않는다.
    btn.onclick = function(){       //변수 btn을 클릭하면 실행되는 함수 선언
        console.log("나는 onclick 2");
    }

    /*결과
    나는 이벤트 구독 중
    나는 이벤트 구독 중 2 
    나는 onclick 2
    */
</script>
</html>

 

 

 


Event

load

  • 페이지와 기타 요소들의 그릴 준비 로딩이 끝났을 때
//어트리뷰트 방식 (on ~)
window.onload = function () {

    
}


// load 이벤트 구독
window.addEventListener('load',function(){
    //load이벤트가 실행되면 내용 실행
});

 

resize

  • 브라우저의 창 크기가 바뀌면 실행되는 이벤트
//어트리뷰트 방식
window.onresize = function(){
    console.log("창 사이즈 변환");
}


// resize 이벤트 구독
window.addEventListener("resize",function(){

})

 

scroll

  • 사용자가 태그나 페이지에서 스크롤 했을 때 실행되는 이벤트
  • 태그의 이벤트로 원하는 이벤트를 구독하면 태그에서 그 이벤트가 발생할 때 실행된다.
div.onscroll = function(){	//div태그에 scroll 이벤트 구독. div태그 내의 스크롤이 존재해야하고
    console.log('나 스크롤 되고 있니?');	//해당 태그 내에서 스크롤이 동작하였을 때 실행된다.
}


document.body.onscroll = function(){	//body태그에 scroll 이벤트 구독.
    
}

 

키보드 이벤트

onkeydown

  • 사용자가 키보드를 누르자마자 발생하는 이벤트
    • 키보드를 누르고 뗀 것이 아닌 눌렀을 그 당시에 바로 실행된다.

onkeyup

  • 사용자가 키보드를 누르고 뗐을 때 발생하는 이벤트
    • 키보드를 누르고 있다가 키를 떼는 순간에 실행된다.

onkeypress

  • 키보드를 누르고 있을 때 발생하는 이벤트
    • 키를 누르고 있으면 계속 실행된다.
  • onkeydown을 누르고 있어도 계속 실행되기 때문에 사용할 경우가 많지 않을 수 있다.
    • 단, 별도의 동작을 구별하는 경우 등에 사용이 가능하다.
      • 예) onkeydown하는 순간에 동작하는 기능 / onkeypress하는 동안 동작하는 기능
window.onkeydown = function(){			//키보드를 누르자마자 발생할 이벤트 함수 선언. onkeydown
    console.log("나 키 누르자마자");
}

window.onkeyup = function(){			//키보드를 떼자마자 발생할 이벤트 함수 선언. onkeyup
    console.log("키보드를 누르다가 뗐어");
}

window.onkeypress = function(){			//키보드를 누르는 동안 발생할 이벤트 함수 선언. onkeypress
    console.log("키보드를 누르고 있는 동안");
}

 

마우스 이벤트

click

  • 사용자가 해당 태그를 클릭했을 때 발생하는 이벤트

dbclick

  • 사용자가 해당 태그를 더블클릭했을 때 발생하는 이벤트

mousedown

  • 사용자가 마우스를 누르자마자 실행되는 이벤트

mouseup

  • 사용자가 마우스를 누르다가 뗐을 때 실행되는 이벤트

mousemove

  • 마우스가 태그 위에서 이동될 때 실행되는 이벤트

mouseenter

  • 마우스가 태그 위에 올려졌을 때 실행되는 이벤트

mouseleave

  • 마우스가 태그 위에서 나갔을 때 실행되는 이벤트

*  onmousedown과 onmouseup

  • 마우스 키를 누르고 이동한 뒤 키를 뗐을 때 좌표로 계산해서 동작해야하는 기능을 만들 때 사용하기도 한다.
  • 페이지 내의 슬라이드 구현이 가능하다.

*  onmousenter와 onmouseleave

  • 마우스가 태그위에 올라갈 때, 빠져나갈 때의 기능을 줄 수 있으니 hover와 유사한 기능으로 사용할 수도 있다.
//click이벤트. 웹페이지 내에서 마우스를 클릭했을 때 실행될 함수 선언.
window.onclick = function(){		
    console.log("나 클릭");
}

//dbclick이벤트. 웹페이지 내에서 마우스를 더블클릭했을 때 실행될 함수 선언.
window.ondblclick = function(){		
    console.log("더블클릭");
}

//mousedown이벤트. 웹페이지 내에서 마우스를 누른 순간 실행될 함수 선언.
window.onmousedown = function(){		
    console.log("마우스 키 다운");
}

//mouseup이벤트. 웹페이지 내에서 눌렀던 마우스를 뗀 순간 실행될 함수 선언.
window.onmouseup = function(){		
    console.log("마우스 키 업");
}

//mousemove이벤트. 변수_div가 가리키는 태그 위에서 마우스가 이동되는 동안 실행될 함수 선언.
_div.onmousemove = function(){		
    console.log("마우스 이동 중 입니다.");
}

//mouseenter이벤트. 변수_box가 가리키는 태그 위에 올려지는 순간에 실행될 함수 선언.
_box.onmouseenter = function(){		
    console.log("마우스가 올려짐");
}

//mouseleave이벤트. 변수_box가 가리키는 태그 위에 올려져있던 마우스가 빠져나가는 순간 실행될 함수 선언.
_box.onmouseleave = function(){		
    console.log("마우스 나갔어");
}

 

모바일터치 이벤트

touchstart

  • 화면을 터치한 순간 발생하는 이벤트

touchend

  • 화면을 터치하다가 떼는 순간 발생하는 이벤트

touchmove

  • 화면을 터치하고 이동할 때 발생하는 이벤트
  • clickmove와 달리 누른 상태로 이동해야 한다.
 //touchstart선언. 웹페이지를 터치하는 순간 실행될 함수 선언.
 window.ontouchstart = function(){
    console.log("모바일 터치됐어");
 }

//touchend선언. 웹페이지를 터치하다가 떼는 순간 실행될 함수 선언.
 window.ontouchend = function(){
    console.log("모바일 터치하다가 뗐어");
 }

//touchmove선언. 웹페이지를 터치하면서 이동할 때(누르면서 이동) 실행될 함수 선언.
 window.ontouchmove = function(){
    console.log("터치하고 이동 중");
 }

 

드래그 이벤트


알고 지나가자!

target

event 인터페이스의 target 속성은 이벤트가 발생한 대상 객체를 가리킨다.


draggable

  • 요소의 드래그 가능 여부를 나타내는 열거형 특성이다.
  • graggable은 true와 false 두 값중 하나를 가질 수 있다.
    • true: 요소를 드래그 할 수 있다.
    • false: 요소를 드래그 할 수 없다.

gragstart

  • 드래그가 시작될 때 실행되는 이벤트

gragend

  • 드래그가 끝났을 때 발생하는 이벤트

dragenter

  • 드래그하고 태그 위에 올려졌을 때 실행될 이벤트

gragleave

  • 드래그하다가 태그 위에서 빠져나갔을 때 실행될 이벤트

gragover

  • 드롭하고 대상이 드롭 가능한지 여부를 설정해준다.

drop

  • 드래그를 하다가 마우스 버튼을 떼면 드롭하는 이벤트
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container{
            width: 800px;
            height: 800px;
            border: 1px solid;
            display: flex;
            flex-wrap: wrap;
        }
        .box{
            width: 400px;
            height: 400px;
            border: 1px solid red;
            box-sizing: border-box;     <!--border 값까지 포함하서 사이즈를 400으로 맞춤-->
        }
        #item{
            width: 100%;
            height: 100%;
            background-color: aqua;
        }
    </style>
</head>
<body>
    <div class="container">
        
        <div class="box">
            <!--드래그를 허용시켜주는 어트리뷰트 속성 true false로 설정-->
                <div id="item" class="item" draggable="true"></div>
        </div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
    </div>
</body>
<script>
    let d = null; //변수 d에 null 값을 대입.
    // 변수 d의 값을 비움

    document.ondragstart = function(e){

        // dragstart이벤트가 발생하는 객체에 클래스 item이 있으면 참(참일경우 실행문 실행)      
        if(e.target.classList.contains("item")){
            //ondragstart가 실행되는 함수의 타켓에 대한 정보를 노출
            //결과: <div id="item" class="item" draggable="true" style="background-color: red;"></div>
            console.log(e.target);
            //전역변수 d에 e.target을 대입하여 드래그할 태그를 담아놓는다.
            d = e.target;
            
            //e.target.style 안에 적용시킬 스타일의 키값에 스타일 값을 추가해줄 수 있다.
            
            //e.target에 대한 스타일 값들을 출력한다.
            //결과: CSSStyleDeclaration {accentColor: '', additiveSymbols: '', alignContent: '', alignItems: '', alignSelf: '', …}
            console.log(e.target.style)
            
            //css에서 작성하던 이름과는 좀 다르다. 해당 js에선 카멜표기법으로 표기한다.
            //CSS 에서 background-color -> backgroundColor
            // - 하이픈 뒤 한글자만 대문자로 구분해주면 된다.
            e.target.style.backgroundColor = "red"
        }
    }

    document.ondragend = function(e){
        // 드래그 끝났으니까 초기화
        d = null;
        //e.target이 item 클래스가 있는 태그였으면
        if(e.target.classList.contains("item")){
            //처음에 입혀줬던 색으로 다시 변경
            e.target.style.backgroundColor = "aqua"
        }
    }

    /*결과: 아쿠아색이었던 클래스 item영역이 드래그 하는 순간 빨간색으로 변하고
            드래그가 끝나면 다시 원래 색상이었던 아쿠아색으로 변경된다. */

    document.ondragenter = function(e){
        //e.target이 box 클래스를 가지고 있고 d가 비어있지 않을 때
        //&&니까 두 조건이 모두 true여야지 조건이 실행된다.
        if(e.target.classList.contains('box') && d !== null){}
            e.target.style.backgroundColor = "blue";
    }   
    /* 결과: div태그의 box클래스인 영역을 item영역을 드래그하여 그 위에 얹어지면
            box 클래스의 영역이 파란색으로 변한다. */

    document.ondragleave = function (e) {
        if(e.target.classList.contains('box') && d !== null){}
        //배경을 투명으로 변경  (transparent = 투명)
        e.target.style.backgroundColor = "transparent";
    }
    /* 결과: div태그가 box클래스에 얹어져 파랗게 변한 영역이 그 영역을 벗어나면
            투명하게 변한다. */

    document.ondragover = function(e){
        if(e.target.classList.contains("box") && d !== null){
            //preventDefault: 기본 동작을 없애준다. 브라우저에서 기본적으로 동작하는 기능을 제거해준다.
            e.preventDefault();
            //from태그 쓰다가 새로고침되는 현상이 발생하는데
            //새로고침되는 현상같은 기본 동작을 제거해주는 역할을 한다.
        }
    }
    /* 결과: div태그를 드래그하여 box클래스 영역에 드래그해서 드롭허면
            box영역이 파랗게 변한다. */
document.ondrop = function(e){
    if(e.target.classList.contains("box") && d !== null){
        e.target.style.backgroundColor = "transparent";
        //append: 원하는 위치 태그에 내용으로 태그를 이동시켜줄 수 있다.
        e.target.append(d);
    }
}
    /* 결과: div태그를 드래그하여 boc클래스 영역들을 이동하다가 드롭하면
            div태그의 값을 box영역에서 받는다. 이전에 지정을 받은 영역은
            투명하게 변한다. */


</script>
</html>

 

 

 


이벤트 내용 확인

이벤트 내용을 값으로 받을 수 있다.

해당 변수가 가리키는 태그를 가져올 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 300px;
            height: 300px;
            border: 1px solid;
        }
    </style>
</head>
<body>
    <div>나는 div영역
        <p>나는 p영역</p>
    </div>
</body>
<script>
    let d = document.querySelector("div");      //div태그를 가리키는 변수 d 선언

    d.onclick = function(r){        //변수 d를 클릭하면 실행될 함수 선언. 매개변수로 r을 갖는다.
        //이벤트가 실행되면 이벤트의 내용이 값으로 넘어온다.

        console.log(r);     // 이벤트 내용 출력
        //결과: PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}

        //해당 이벤트가 일어난 타켓
        //변수 d가 가리키는 div영역을 click이벤트가 실행되면 동작하는 함수이므로
        //실행되면 click된 태그를 target이 해당 태그를 가져온다.
        console.log(r.target);      //클릭된 태그의 내용 출력
        /* 결과
        div태그 클릭 : 
            <div>나는 div영역
            <p>나는 p영역</p>
            </div>
        p태그 클릭: <p>나는 p영역</p>
        */
            
    }
</script>
</html>

 

마우스의 위치를 확인할 수 있다.

window.onmousemove = function(m){
	//이벤트 타입을 확인
	console.log(m.type);        //결과: mousemove

	//해당 이벤트 일어나면 나타날 마우스의 좌표 x값
	//좌표 값은 픽셀단위로 노출된다.
	// 0 ~ 브라우저의 너비크기
	console.log(m.pageX);

	//이벤트 발생 시 나타날 마우스 좌표 Y값
	// 0 ~ 브라우저의 높이
	console.log(m.pageY);
}

 

키보드로 입력한 글자의 ASCII코드 값을 확인할 수 있다.

window.onkeydown = function(e){

    console.log(e.keyCode);     //키보드로 누른 문자가 ASCII 코드값으로 노출된다.
    //ascii코드: 숫자로 표현된다.
    
    //A를 입력하면 나타날 콘솔 값
    if(e.keyCode == 65){
        console.log("A키를 입력 받았다.");
    }
}

 

기본적으로 내재되어 있는 동작을 취소할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!--form의 기본 속성이 새로고침이므로 form에 속해있는 button을 누르면 페이지가 새로고침된다.--> 
    <form action="">            
        <!--button 태그의 기본 속성은 submit(데이터를 제출하는 속성)이다.-->
        <button type="submit" class="btn_class">클릭</button>
    </form>
</body>
<script>
    let _button2 = document.querySelector(".btn_class");

    _button2.onclick = function(e){
        //기본동작이 제거된다.
        //브라우저 상에서 기본 동작되는 기능을 제거해줄 수 있다.
        e.preventDefault();
    }
    //결과: form의 기본 속성인 새로고침이 동작하지 않는다.
</script>
</html>

 

 

 


쿠키

 

  • 웹사이트를 방문하고 사용자의 PC에 기록할 간단한 데이터이다.
  • PC에 저장해두었다가 값을 호출해서 사용할 수 있다.
  • 브라우저가 종료되어도 남아있다.
  • 로컬에 파일 형태로 저장되기 때문에 요청 속도는 서버를 통하는 다른 저장소보다 비교적 빠르다.
  • 사용자의 로컬에서 관리되기 때문에 보안적인 부분에서 취약할 수 있다는 단점이 있다.

 

쿠키 종류

  • Session Cookie: 메모리에만 저장되며, 만료시간이 있지만 브라우저 종료시 삭제되는 쿠키
  • Persistent Cookie: 파일로 저장되며, Max-Age 설정을 통해 장기간 유지 가능하고 브라우저 종료와 관계없이 사용 가능한 쿠키
  • Secure Cookie: HTTPS에서 사용되는 암호화된 쿠키. 비교적 안전하지만 실질적 보안이 제공되지 않아 민감한 데이터 저장 절대 금지
  • Third Party Cookie: 다른 도메인에 요청이 필요할 때 생성하는 쿠키. 주로 광고 목적으로 사용되며, 유저 개인정보 악용의 문제 발생

 

쿠키 특징

장점

  • 대부분의 브라우저가 지원
  • 데이터 유효기간 지정 가능 (ex. 1 hour, 1 day)
  • XSS (사이트 간 악성 Js 코드를 심는 행위)로부터 안전 - 서버에서 쿠키의 httpOnly 옵션을 설정하면, Js에서 쿠키에 접근 자체가 불가능

단점

  • 매우 작은 데이터 저장 용량 (4kb)
  • 매번 서버에 HTTP 요청시 같이 전달되어 서버에 부담
  • 암호화가 안되어 있어 유저 정보 도난 위험
  • CSRF(사이트 간 요청 위조) 위협 - 공격자가 사용자의 요청을 가로챈 뒤 사용자의 의지와 상관없이 보안적으로 위험한 행동을 하게끔 변조하여 부당 이익을 취하는 행위
  • 문자열만 저장 가능

 

쿠키구조

  • 쿠키에도 키와 값이 있다.
  • 문자열로 저장하면 된다.
  • 쿠키의 매개변수는 (name, value, time)이다.
    • name: 쿠키의 이름(키)
    • value: 쿠키 안의 내용(값)
    • time: 유효시간

 

쿠키생성

new Date()

  • 새로운 Date객체가 만들어진다.
  • new Date()
    • 인수없이 호출하면 현재의 날짜와 시간이 지정된 Date객체가 반환된다.
let now = new Date();
alert( now ); // 현재 날짜 및 시간이 출력됨
  • new Date(milliaeconds)
    • UTC 기준(UTC+0) 1970년 1월 1일 0시 0분 0초에서 milliseconds 밀리초(1/1000 초) 후의 시점이 저장된 Date 객체가 반환된다.
    • 1970년의 첫날을 기준으로 흘러간 밀리초를 나타내는 정수는 타임스탬프(timestamp) 라고 부른다.
      • 타임스탬프를 사용하면 날짜를 숫자 형태로 간편하게 나타낼 수 있다.
      • date.getTime() 메서드를 사용해 Date 객체에서 타임스탬프를 추출하는 것도 가능하다.
// 1970년 1월 1일 0시 0분 0초(UTC+0)를 나타내는 객체
let Jan01_1970 = new Date(0);
alert( Jan01_1970 );

// 1970년 1월 1일의 24시간 후는 1970년 1월 2일(UTC+0)임
let Jan02_1970 = new Date(24 * 3600 * 1000);
alert( Jan02_1970 );
  • new Date(datestring)
    • 인수가 하나인데, 문자열이라면 해당 문자열은 자동으로 구문 분석(parsed)이 된다.
let date = new Date("2017-01-26");
alert(date);
// 인수로 시간은 지정하지 않았기 때문에 GMT 자정이라고 가정하고
// 코드가 실행되는 시간대(timezone)에 따라 출력 문자열이 바뀝니다.
// 따라서 얼럿 창엔
// Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time)
// 혹은
// Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time)등이 출력됩니다.
  • new Date(year, month, date, hours, minutes, seconds, ms)
    • 주어진 인수를 조합해 만들 수 있는 날짜가 저장된 객체가 반환됩니다(지역 시간대 기준). 첫 번째와 두 번째 인수만 필수값입니다.
    • year는 반드시 네 자리 숫자여야 한다. 
      • 2013은 괜찮고 98은 괜찮지 않습니다.
    • month는 0(1월)부터 11(12월) 사이의 숫자여야 한다.
    • date는 일을 나타내는데, 값이 없는 경우엔 1일로 처리된다.
    • hours/minutes/seconds/ms에 값이 없는 경우엔 0으로 처리된다.
new Date(2011, 0, 1, 0, 0, 0, 0); // 2011년 1월 1일, 00시 00분 00초
new Date(2011, 0, 1); // hours를 비롯한 인수는 기본값이 0이므로 위와 동일

let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 2011년 1월 1일, 02시 03분 04.567초

getTime()

  • 표준시에 따라 지정된 날짜의 시간에 해당하는 숫자 값을 반환한다.
  • 날짜 복사에도 사용된다.
// 월은 0부터 시작하여 생일은 1995 년 1 월 10 일이됩니다.
var birthday = new Date(1994, 12, 10);
var copy = new Date();
copy.setTime(birthday.getTime());

 

 

쿠키 유효시간

 //현재 시간에 정보를 가지고 있는 객체를 만들어준다.
let date = new Date();
    
date.setTime(date.getTime() + time * 24 * 60 * 60 * 1000);
//현재 시간 + 1일의 시간을 추가한 것이 해당 쿠키의 만료시간이 된다.

//set get
//set: 변경할 때 네이밍으로 많이 사용한다.
//get: 정보를 호출할 때, 객체로 만들어서 정보를 가져오는 경우

 

쿠키를 추가하는 방법

  • 기본 규격
    • 쿠키의 명 = 값;expires+만료일+";path=/"
  • path=/: 페이지의 경로에 대한 설정 쿠키를 다루는 경로
  • toUTCString메소드: 날짜 시간 표시 방법을 변경해준다.
let date = new Date();
date.setTime(date.getTime() + time * 24 * 60 * 60 * 1000);

document.cookie = name+"="+value+";expires"+date.toUTCString()+";path=/";
//예) "Wed, 22 Mar 2023 04:47:13 GMT"

 

쿠키함수 작성 및 제거

//쿠키함수를 작성해보자.
//정규식이 포함되기는 하는데 지금은 무시해도 된다.
//다들 정규식은 간단한것만 사용하고 핗요한 내용이 생가면 찾고 하면 편해서 팢아서 작성하는 경우가 많다.
function getCookie2(name){
    //match 메소드
    //매개변수로 정규식 전달
    let value = document.cookie.match("(^|;) ?" + name + "+([^;]*)(;|$)");
    console.log(value);
    return value ? value[2] : null;
}



//쿠키를 제거하는 함수.
//쿠키를 상하게만 하면 된다. 날짜를 강제로 지나게 하는 것.

function deleteCookie(name){
    document.cookie = name + "=; expries=Thu, 01 jan 1999 00:00:10 GMT;";
}
deleteCookie("이벤트 팝업");
deleteCookie("이벤트 팝업2");
console.log(getCookie2("이벤트 팝업"));
console.log(getCookie2("이벤트 팝업2"));

 

 


세션, 로컬 스토리지

 

  세션 스토리지 로컬 스토리지
데이터 유지 브라우저 종료 시 삭제 브라우저 종료 시 보관
데이터 범위 동일한 도메인 전역 공유 브라우저간 공유 안됨

세션 스토리지 (Session storage)

  • window.sessionStorage에 위치한다.
  • 브라우저가 동작되는 동안에 남아있는 데이터
    • 브라우저의 종료 시점까지 유지된다.
  • 도메인이 같더라도 브라우저가 다르면 브라우저 컨택스트가 다르기 때문에 각각의 세션 스토리지가 형성되어 데이터공유가 되지 않는다.
  • 상태같은 내용을 다룰 때 사용한다. (예. 로그인 되어있는 상태)

로컬 스토리지 (Local Storage) 

  • window.localStorage에 위치한다.
  • 브라우저를 종료해도 데이터를 보관한다.
  • 도메인만 같으면 전역적으로 데이터가 공유되는 특성을 가지고 있다.
  • 데이터에 만료기한이 없다.
  • 보안 이슈로 민감한 값을 저장해서는 안된다.

setItem()

  • 값을 저장할 때 사용한다.
  • window.localStorage.setItem("키","값");

getItem()

  • 값을 호출할 때 사용한다.
  • window.localStorage.getItem("키");
<!--index4.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="./index5.html">페이지 이동</a>
</body>
<script>
    window.localStorage.setItem("keyA", "abcdefu");
</script>
</html>
<!--index5.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    console.log(window.localStorage.getItem("keyA"));
    //index4에서 페이지 타고 이동한 결과: abcdefu
</script>
</html>

 

세션 스토리지 & 로컬 스토리지 메소드

//setItem 메소드: 첫 매개변수 = 키, 두 번째 매개변수 = 값
sessionStorage.setItem('Token','데이터 내용');      //키와 값을 저장

//세션에 저장된 데이터를 호출
//getItem: 세션에 저장된 데이터를 호출 매개변수로는 키 값을 전달
console.log(sessionStorage.getItem('Token'));

//문서에 내용을 쓰기 추가할 수 있다.
document.write(sessionStorage.getItem('Token'));    //body에 출력

//세션의 길이 구하는 법
sessionStorage.length
document.write(sessionStorage.length);      //결과 2

//세션의 키를 인덱스로 호출
//key 라는메소드
document.write(sessionStorage.key(1));

//세션삭제
//clear: 세션 전체 삭제
sessionStorage.clear();

//로컬스토리지에 추가
window.localStorage.setItem("key", "value");

//로컬스토리지 값을 호출
window.localStorage.getItem("key");

//로컬스토리지 전체 값을 제거
window.localStorage.clear();

//로컬스토리지 길이
window.localStorage.length;

//로컬스토리지 key 호춯
window.localStorage.key(0);

 

 

 

 

 

728x90