1. window.history简介
在Web开发中,通过JavaScript可以操作当前访问的浏览器页面,其中window.history对象是一个重要的对象,可以处理访问历史和管理浏览器状态。window.history提供了一些API,可以在JavaScript中与浏览器历史记录进行交互,包括向前和向后导航、添加和修改历史记录等,这对于实现SPA(单页应用)等重要的Web应用程序至关重要。
1.1 window.history常用属性
window.history对象有若干属性,其中比较常用的有length属性,表示当前会话历史记录中的页面数量。
console.log(window.history.length); // 打印当前会话的历史记录页面数量
1.2 window.history常用方法
window.history对象的方法可以让开发者操作会话历史记录,包括前进、后退和添加记录等操作。其中常用的方法有:
back():向后导航一个页面,相当于点击浏览器的后退按钮。
forward():向前导航一个页面,相当于点击浏览器的前进按钮。
go():通过向前或向后导航指定数量的页面来控制页面导航。例如go(-1)相当于back(),go(1)相当于forward()。
pushState():往会话历史记录栈中添加一条新记录,可以修改URL和浏览器历史记录,并不会触发页面的刷新。使用pushState()可以实现无刷新局部更新页面的效果,常用于单页应用中。
replaceState():与pushState()类似,但是不会在历史记录栈中添加新记录,而是替换会话历史记录中的当前记录。因为会话历史记录是个栈结构,replaceState()可以将当前页面的状态覆盖到历史记录的前一个页面上,从而避免了历史记录中出现不必要的页面,例如登录成功后刷新页面。
2. pushState和replaceState详解
pushState和replaceState是衍生自window.history的两个方法,这两个方法可以改变浏览器的URL地址、添加或修改历史记录,是SPA中非常重要的方法之一。
2.1 pushState方法
pushState方法可以实现无刷新的局部更新页面效果,通过控制页面的状态触发浏览器对应的路由,从而实现路由切换。pushState的语法如下:
window.history.pushState(stateObject,title,url);
其中,stateObject是一个JavaScript对象,表示我们要保存到历史记录栈中的对象。title是浏览器标题栏中的标题,这个参数在大部分浏览器中并不起作用,可以传空字符串。url表示新的URL地址,当调用pushState()方法时,实际上是修改了当前页面的URL。
使用pushState()方法后,如果需要实现前进或后退功能,需要监听浏览器前进或后退按钮的事件,然后使用window.history.go()或window.history.back()方法实现。例如:
window.history.pushState(null, null, '/foo');
window.history.pushState(null, null, '/bar');
window.history.pushState(null, null, '/baz');
window.addEventListener('popstate', function(event) {
console.log('回到了', document.location, 'state:', event.state);
});
window.history.back(); // 回到了 /bar
window.history.back(); // 回到了 /foo
在这个例子中,我们首先使用pushState()方法将URL导航到/foo、/bar和/baz三个页面,然后监听浏览器的popstate事件,在这个事件触发时回调函数会被执行,打印当前URL和历史记录中对应状态对象的状态。
最后我们使用back()方法回到了前一个页面/bar,接着又回到了前一个页面/foo。
2.2 replaceState方法
replaceState方法与pushState方法类似,但是不会在历史记录栈中添加新纪录,而是用新状态替换了浏览器历史记录栈中的当前页面。replaceState的语法如下:
window.history.replaceState(stateObject,title,url);
使用replaceState方法,可以避免不必要的历史记录,比如登录成功后刷新页面。替换历史记录时,当前页面的url已经改变,但是浏览器不会刷新页面,而是将这次替换的历史记录当前页引用。
3. 总结
通过window.history对象可以实现对当前会话浏览器的历史记录的控制和管理,其中最重要的方法包括back()、forward()和go(),而pushState()和replaceState()则可以实现无刷新的局部更新页面效果,是实现SPA中路由切换的重要手段。在使用pushState()或replaceState()方法改变浏览器的URL地址时,要注意将浏览器的前进、后退按钮事件监听,便于实现前进、后退功能。