ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SPA에서 History API 이해
    프론트엔드/javascript 2023. 10. 16. 17:04
    728x90

    SPA에서 History API 이해

     

    주소 내역은 하나의 목록이다.
    뒤로가기, 앞으로가기는 목록 안에서 이동하는 것이다.
    따라서, 목록에 새로운 주소를 추가하면 페이지를 이동한 셈이 된다.
    목록에 주소를 추가하기 위한 메소드(history.pushState(). history.replaceState())가 HTML5에서 생겼다.

    예제를 만들고 테스트하며
    목록에 주소를 추가하는 메소드 history.pushState(), historyreplaceState()를 비교하자.

    아래 예제를 book 폴더 아래에 만든다.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>History API</title>
    </head>
    <body>
        <div id="state"></div>
        <button id="pushState">pushState</button>
        <button id="replaceState">replaceState</button>
        <script>
            document.querySelector('#pushState').addEventListener('click', function(){
                history.pushState({data:'pushpush'}, 'title을 pushState로', '/pushpush');
            });
            document.querySelector('#replaceState').addEventListener('click', function(){
                history.replaceState({data:'replace'}, 'title을 replaceState로', '/replace');
            });
            window.addEventListener('popstate', function(){
                //history.length : 세션 기록 길이
                //history.state : 기록 스택 최상단 state 값            
                console.log('popstate',history.length, history.state);
                document.querySelector('#state').innerHTML = JSON.stringify(history.state);
            });
        </script>
    </body>
    </html>



    ①'pushState' 버튼을 클릭하면, 
    페이지가 새로 갱신되지 않지만 주소만 바뀌고, 
    뒤로가기 버튼이 활성화된다. 
    주소 목록에 새로운 주소가 추가된다.
    이 메서드는 비동기로 동작한다.

    ②'replaceState'버튼을 클릭하면, 
    뒤로가기가 활성화되지 않고 주소만 바뀐다.
    이전 주소를 없애고 바꿀 주소로 대체된다.

    뒤로가기, 앞으로가기를 했을 때 popstate 이벤트가 발생한다.

     

    출처 : https://www.zerocho.com/category/HTML&DOM/post/599d2fb635814200189fe1a7

    참고 : https://developer.mozilla.org/ko/docs/Web/API/History/pushState

    728x90
Designed by Tistory.