【摘要】:不论是使用location跳转新的网址,还是使用history跳转,都会导致浏览器刷新网页,重新请求大部分重复的CSS、JS等文件。这种切换不会导致网页刷新,对用户更友好。动手写13.4.2执行13.4.2.html,注意网址变化时网页不会刷新,如下图所示。图13.4.2使用history.pushState()刷新网页history.pushState()需要配合window.onpopstate()事件一起使用,才能完全实现浏览器网页的前进、后退、刷新和跳转。
不论是使用location跳转新的网址,还是使用history跳转,都会导致浏览器刷新网页,重新请求大部分重复的CSS、JS等文件。使用location.hash修改网址的hash部分,不会导致网页刷新,但网址并不美观,而且会影响SEO,让搜索引擎误判两个不同hash的网页为同一个网页。
history提供了pushState()函数。通过pushState()修改网址时,浏览器不会刷新网页,所有CSS、JS以及图片资源都还存在,此时使用JavaScript控制页面切换,可以实现无感知刷新网页。该函数接收三个参数,语法如下:
参数说明:
◇ history:表示历史对象。
◇ data:表示该状态对应的数据对象;state的含义是状态,pushState就像数组一样将这个state放到数组列表中,当触发popstate事件时,浏览器将这个data对象从数组中取出,传递给popstate事件。
◇ title:表示网页标题,但是目前所有浏览器都会忽略该参数,不论设置什么值都没有效果,因此在使用history.pushState()函数时要配合修改document.title属性才能修改网页标题,也可以通过修改<title>标签来修改网页标题。
◇ newUrl:表示调用history.pushState()之后网址栏显示的新网址。
在执行过history.pushState()函数的页面,当用户点击后退或前进时,会触发window对象的onpopstate事件。在网页中监听onpopstate事件,接收state变化通知,从而进行网址切换。这种切换不会导致网页刷新,对用户更友好。
13.4.2.html使用pushState()方法修改网址,如下所示。
动手写13.4.2(www.chuimin.cn)
执行13.4.2.html,注意网址变化时网页不会刷新,如下图所示。
图13.4.2 使用history.pushState()刷新网页
history.pushState()需要配合window.onpopstate()事件一起使用,才能完全实现浏览器网页的前进、后退、刷新和跳转。
点击浏览器后退按钮,第一次触发popstate事件,因为之前没有对该网址设置stateData,所以此时event.state为null;接下来点击浏览器前进按钮,第二次触发popstate事件,此时event.state即为调用函数history.pushState()设置的stateData。
history.replaceState()与location.replace()类似,直接替换当前访问state,不会增加新的历史记录。
使用history.pushState()可以实现与location.assign()一样的效果,且完全不需要二次加载整个网页。