Javascript不会刷新浏览器的前向后退功能。

最近,在学习骨干,学习了解主干首先需要了解spa。了解spa需要首先了解单页应用程序不刷新和更改URL的原因。

随着不同的页面跳转相比,Ajax可以大大提高用户的浏览体验,而不需要看到页面之间的白色屏幕是一件令人愉快的事,但很多以前的AJAX应用程序不支持的浏览器的前进和后退,导致用户的网站浏览到哪里,一旦刷新会立即回到原来的位置,并且用户可以通过浏览器的后退按钮来实现切换浏览历史。

对于第一个问题,这个解决方案相当简单。只要饼干或localStorage用于应用程序的状态记录,你可以阅读状态时刷新页面,然后改变页面发送相应的请求。但另一个问题是很麻烦的,先说现代浏览器的解决方案。

HTML5解决方案

要了解HTML5是如何向前移动的,您必须首先了解历史对象和位置对象。

历史对象

历史对象的属性

1.length:返回浏览器历史记录列表URL的数量,以及用户访问的页面与一些1当前标签。由于隐私原因,URL的具体内容是不可见的。

2.state:与当前的URL关联的对象只能添加或pushstate和replacestate修改。我们可以用它来存储信息的URL。

历史对象的方法

1.history.back()

此方法没有参数,它将返回到上一页,这相当于单击浏览器的后退按钮。

2.history.forward()

此方法没有参数,它将返回到返回之前浏览的页面,这相当于单击浏览器的前向按钮。

3.history.go(数)

此方法接受整形变量参数。History.go(1)相当于背页。History.go(1)相当于前进一页,和history.go(0)将刷新当前页面。

4.history.pushstate(状态、标题、URL)

更改URL和不刷新页面的关键是它吗。这种方法会改变当前页面的location.href和修改当前history.state对象。执行后,history.length将增加1。这个方法接受三个参数,

1.state:当前URL相关的对象。

2.title:网页标题,但所有的浏览器忽略它,改变标题或使用document.title。

3.url:一个域作为当前页面相同的网站,和location.href将成为这个价值。

5.history.replacestate(状态、标题、URL)

这种方法是相同的,但它并不能改变history.length只能改为history.state和location.href。

注意,pushstate和replacestate第三参数非跨域和不触发浏览器的popstate事件和onhashchange事件(试验下,Chrome33)。

定位对象

除了单击前进后退按钮和历史事件之外,还可以使用位置方法更改URL并修改位置的属性。

位置对象的属性(读和写):

1.host:域名+端口号

2.hostname:域名

3.port:端口号

4.protocol:协议

5.href:完整路径

6.origin:协议+域名+端口

7.hash:嗯,(#)网址(哈希)

8.pathname:文件路径+文件名

背后的内容9.search:()

它可以实现无刷新的目的,通过改变location.href或location.hash。

定位对象的方法:

1.assign:改变URL的值增加了1的历史record.location.assig当前URL(# + x)将改变URL,但不刷新页面。

2.reload:刷新页面。

3.replace:改变URL的值,但history.length不改变使用的分配方法。

popstate事件

当URL变化,如用户单击前进/后退按钮,history.go(N)(N不等于0),location.hash = X(X不等于当前位置。哈希)会触发这个事件。它可以用来监测各种功能的URL。

复制代码代码如下所示:

window.onpopstate =函数(){

/做某事

}



Onhashchange event

改变哈希值的popstate触发事件,和事件触发的popstate并不必然引发onhashchange事件。经过测试:

1.hash变化,但不变的onhashchange location.pathname触发事件,如history.pushstate(' # ABC);

的2.hash和location.pathname变化不触发,如history.pushstate(一# ABC);

旧的浏览器

旧的浏览器不支持pushstate和replacestate,因此不能听URL改变通过popstate(事实上,它不支持这种方法),它只能实现无刷新改变URL #后面的内容,但他们不支持onhashchange,所以URL的变化无动于衷(除了那页面将滚动到页面对应的ID的位置),那么只有祭出大招:投票,一个setInterval听这样的URL的值:

复制代码代码如下所示:

无功prevhash = window.location.hash;

var回调函数(){…}

Window.setInterval(function(){()

如果(window.location.hash!= prevhash){

prevhash = window.location.hash;

回调(prevhash);

}

},100);



当然,这篇文章很令人沮丧。如果我们不考虑带有id的点击页面来改变哈希的情况,我们可以使用设计模式来优雅地实现监听器URL。然后监视URL更改(观察者)的所有类都订阅这个类。

复制代码代码如下所示:

更改类

函数的UrlChanger(){

无功_this =这;

this.observers = { };

观察者添加

this.addobserver =功能(obj){…}

删除/观察员

this.deleteobserver =功能(obj){…}

注意/观察者

这个_notifyobservers =函数(){

VaR的长度= _this.observers.length;

console.log(长度)

对于(var i = 0;i <长度;i + +){

_this。观察员{我}更新();

}

}

更改

this.changeurl =函数(Hash){

window.location.hash =哈希;

_this _notifyobservers();

}

}

/听力课

功能oneofobservers(){

无功_this =这;

this.update =函数(){…}

}

实现

VaR O1 =新UrlChanger();

VaR O2 =新oneofobservers();

o1.addobserver(O2);

o1.changeurl('fun / / / arg1 arg2);

某人已经做了某事。