세션 히스토리
는 페이지를 이동할 때마다 쌓이게 되며, 이를 통해 뒤로가기나 앞으로 가기 등의 이동을 할 수 있다.
http://host:port/path?queryString
게시물 작성을 예로 들면 작성을 다한 후
history.pushState
는 작성이 끝난 페이지로 이동시킬 것이다. 이 때 이전버튼을 누르다면 다시 작성페이지로 돌아가 재작성 해야한다.. 하지만history.replaceState
는 작성된 페이지의 url로 대체해버리기 때문에 작성하는 페이지로 돌아가지 않는다!!
ex) 뒤로가기로 이동이 불가능 하도록 처리할 때 사용 (replace)
location.href = '/product/1'
를 사용하면 이 url로 이동을 해버리기 때문에 콘솔 입력이 날아간다... (! 주의)product1, 2, 3을 넣고 뒤로 가기 앞으로 가기 등을 해본 결과 history length 자체에는 변화가 없지만 자유롭게 뒤로 가기, 앞으로 가기가 가능했다 😀
product4를 push
로product/new를 replace
로 생성하고 뒤로가기를 눌러보았는데 바로 이전인 product4로 돌아가는게 아니라 그 전인 3으로 돌아갔다! history의 length에도 replace로 생성한 new가 반영되지 않았다.(4를 new로 대체..?)
로그인이나 장바구니? 같은 페이지를 구축할 때 매우 유용할 것 같다!!
예:index.html
로 요청을 돌려주는 처리가 필요하다.npx serve -s
function Route(){ // 1번 조건
const {pathname} = location
const $container = document.querySelector('#container')
if(pathname === '/'){
$container.innerHTML = '<h1>Home</h1>'
}else if(pathname === '/product-list'){
$container.innerHTML = '<h1>상품 목록</h1>'
}else if(pathname === '/article-list'){
$container.innerHTML = '<h1>게시글 목록</h1>'
}
}
Route();
window.addEventListener('click', e => {
if(e.target.className === "linkItem"){ // 2번 조건
e.preventDefault()
const {href} = e.target //http://127.0.0.1:5500/product-list
const path = href.replace(window.location.origin, '') /// product-list 앞에 url을 짤라버림
history.pushState(null, null, path) //이동 없이 url이 바뀐다.
Route()
}
})
// 3번 조건
window.addEventListener('popstate', Route) //이전이나 다음버튼을 눌렀을 때 멈춰있지 않고 Route에 따라 변하도록 설정
location의 pathname
을 기준으로 어떤 페이지를 렌더링할 지 정해야한다. -> Route 로직pushState
로 호출하는 식으로 바꿔야한다! popstate
이벤트 : 뒤로가기나 앞으로 가기를 할 때 발생하는 이벤트를 통해 제대로 동작하도록 한다.