본 글은 HTML5의 히스토리에서 제공하는 pushState와 replacementStateAPI를 주로 기록하고 있습니다. 마지막으로 이러한 API를 통해 소규모 라우팅을 직접 구현하세요.
window.history에서 제공하는 API는 Mozilla 문서를 참고하세요.
history에서 제공하는 pushState, replacementState API는 브라우저 히스토리 스택을 동작시키기 위한 메소드를 제공합니다.
pushState:
history.pushState(data, null, '#/page=1'); pushState接收3个参数,第一个参数为一个obj,表示浏览器 第二个参数是document.title的值,一般设定为`null` 第三个参数string,用以改变 当前url
pushState 메소드는 URL을 변경하는 동안 새 기록 레코드를 브라우저 기록 스택에 푸시합니다.
URL을 받는 매개변수는 문자열 형식으로 현재 주소 표시줄의 URL을 변경하는 데 사용됩니다. 주의할 점은 이 매개변수가 크로스 도메인과 동일할 수 없다는 점입니다. 프로토콜, 도메인 이름 및 포트는 동일해야 합니다. 교차 도메인이 있는 경우 도메인의 경우
Uncaught DOMException: Failed to execute 'pushState' on 'History': A history state object with URL 'http://www.baidu.com/' cannot be created in a document with origin 'http://commanderXL.com' and URL
예:
打开www.baidu.com history.pushState(null, null, '?page=1') //地址栏变成 www.baidu.com/?page=1 history.pushState(null, null, '#page=2'); //地址栏变成 www.baidu.com/#page=2
history.replaceState(null, null, '#page=2');
window.addEventListener('popstate', function() { });
history.pushState({page: 1}, null, '?page=1'); history.pushState({page: 2}, null, '?page=2'); history.back(); //浏览器后退 window.addEventListener('popstate', function(e) { //在popstate事件触发后,事件对象event保存了当前浏览器历史记录的状态. //e.state保存了pushState添加的state的引用 console.log(e.state); //输出 {page: 1} });
addRoute('/login', function() { //do something }) //路由处理 const routeHandle = (path) => { Router.forEach((item, index) => { if(item.path === path) { item.handle.apply(null, [path]); return true; } }) return false; } //拦截默认的a标签行为 document.addEventListener('click', function(e) { let dataset = e.target.dataset; if(dataset) { if(routeHandle(dataset.href)) { //阻止默认行为 e.preventDefault(); } } })
var oldHash = location.hash; setTimeInterval(function() { if(oldHash !== location.hash) { //do something oldHash = location.hash; } }, 100);
window.addEventListener('hashchange', function() { routeHandle(locaiton.hash); });