现在的网络应用程序越来越多的使用AJAX异步请求完成页面的无缝刷新,导致浏览器的URL不会发生任何变化而完成了请求,从而破换了用户浏览体验。同时本次浏览的页面内容在用户下次使用URL访问时将无法重新呈现,使用路由可以很好地解决这个问题。
路由需要实现三个功能:
//设置 url 的 hash,会在当前url后加上'#abc' window.location.hash='abc'; let hash = window.location.hash //'#abc'
window.addEventListener('hashchange',function(){ //监听hash变化,点击浏览器的前进后退会触发 })
History 对象主要有两个属性。
History.length
:当前窗口访问过的网址数量(包括当前网页)History.state
:History 堆栈最上层的状态值(详见下文)
// 当前窗口访问过多少个网页 history.length // 1
// History 对象的当前状态 // 通常是 undefined,即未设置 history.state // undefined
这三个方法用于在历史之中移动。
History.back()
:移动到上一个网址,等同于点击浏览器的后退键。对于第一个访问的网址,该方法无效果。History.forward()
:移动到下一个网址,等同于点击浏览器的前进键。对于最后一个访问的网址,该方法无效果。 History.go()
:接受一个整数作为参数,以当前网址为基准,移动到参数指定的网址。如果参数超过实际存在的网址范围,该方法无效果;如果不指定参数,默认参数为0,相当于刷新当前页面。
history.back(); history.forward(); history.go(1);//相当于history.forward() history.go(-1);//相当于history.back() history.go(0); // 刷新当前页面
注意:移动到以前访问过的页面时,页面通常是从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。
语法:history.pushState(object, title, url)
该方法接受三个参数,依次为:
object
:是一个对象,通过 pushState 方法可以将该对象内容传递到新页面中。如果不需要这个对象,此处可以填 null。
title
:指标题,几乎没有浏览器支持该参数,传一个空字符串比较安全。
url
:新的网址,必须与当前页面处在同一个域。不指定的话则为当前的路径,如果设置了一个跨域网址,则会报错。
var data = { foo: 'bar' }; history.pushState(data, '', '2.html'); console.log(history.state) // {foo: "bar"}
注意:如果 pushState 的 URL 参数设置了一个新的锚点值(即 hash),并不会触发 hashchange 事件。反过来,如果 URL 的锚点值变了,则会在 History 对象创建一条浏览记录。
如果 pushState() 方法设置了一个跨域网址,则会报错。
// 报错
// 当前网址为 http://example.com
history.pushState(null, '', 'https://twitter.com/hello');
上面代码中,pushState 想要插入一个跨域的网址,导致报错。这样设计的目的是,防止恶意代码让用户以为他们是在另一个网站上,因为这个方法不会导致页面跳转。
该方法用来修改 History 对象的当前记录,用法与 pushState() 方法一样。
假定当前网页是 example.com/example.html。
history.pushState({page: 1}, '', '?page=1')
// URL 显示为 http://example.com/example.html?page=1
history.pushState({page: 2}, '', '?page=2');
// URL 显示为 http://example.com/example.html?page=2
history.replaceState({page: 3}, '', '?page=3');
// URL 显示为 http://example.com/example.html?page=3
history.back()
// URL 显示为 http://example.com/example.html?page=1
history.back()
// URL 显示为 http://example.com/example.html
history.go(2)
// URL 显示为 http://example.com/example.html?page=3
每当 history 对象出现变化时,就会触发 popstate 事件。
注意:
仅仅调用pushState()
方法或replaceState()
方法 ,并不会触发该事件;
只有用户点击浏览器倒退按钮和前进按钮,或者使用 JavaScript 调用History.back()
、History.forward()
、History.go()
方法时才会触发。
另外,该事件只针对同一个文档,如果浏览历史的切换,导致加载不同的文档,该事件也不会触发。
页面第一次加载的时候,浏览器不会触发popstate
事件。
使用的时候,可以为popstate
事件指定回调函数,回调函数的参数是一个 event 事件对象,它的 state 属性指向当前的 state 对象。
window.addEventListener('popstate', function(e) {
//e.state 相当于 history.state
console.log('state: ' + JSON.stringify(e.state));
console.log(history.state);
});
因篇幅问题不能全部显示,请点此查看更多更全内容