场景描述:
a页打开b页,b页执行history.go(-1)意图关闭当前页的同时刷新a页。但在微信客户端或者部分android手机无效果。
供参考的处理方式:
1、在js中写上location.href = document.referrer;就可以实现跳转到上一个页面了,让用户觉得体验很好
但是在IE中referrer就没那么尽人意了啊,IE会清空referrer
众所周知,我们web开发人员痛恨IE浏览器,因为IE不支持标准,标准外的默认行为又和其他浏览器经常不一致:
在IE中用javascript做跳转,比如用window.location.href = “http://www.google.com”; google无法取到浏览器请求的HTTP referrer,因为IE清空了document.referrer
而其他主流浏览器Firefox和Chrome都会保留referrer,这意味着IE又要享受“部长级”特殊待遇了:
var referLink = document.createElement('a');
referLink.href = url;
document.body.appendChild(referLink);
referLink.click();
}else {
location.href = url;
}
这样的原理就是给IE浏览器的页面偷偷加了个链接,然后自动点这个链接,于是referrer就能保留了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、window.onpageshow事件
window.onpageshow = function(event){
if (event.persisted) {
//todo something or like window.location.reload();
}
};
前述:
Firefox和Opera有一个新特性,名叫“往返缓存”(back-forward cache,或bfcache),可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度。
这个缓存中不仅保存着页面数据,还保存了DOM和JavaScript的状态;实际上是将整个页面都保存在了内存里。
如果页面位于bfcache中,那么再次打开该页面就不会触发load事件。
尽管由于内存中保存了整个页面的状态,不触发load事件也不应该会导致什么问题,但为了更形象地说明bfcache的行为,Firefox还是提供了一些新事件。
第一个事件就是pageshow,这个事件在页面显示时触发,无论页面是否来自bfcache。在重新加载页面中,pageshow会在load事件触发后触发;
而对于bfcache中的页面,pageshow会在页面状态完全恢复的那一刻触发。另外要注意的是,虽然这个事件的目标是document,但必须将其事件处理程序添加到window。
有时可能需要在pagehide事件触发时根据persisted的值采取不同的操作。
对于pageshow事件,如果页面是从bfcache中加载的,那么persisted的值就是true;
对于pagehide事件,如果页面在加载之后会保存在bfcache中,那么persisted的值也会被设置为ture。
因此,当第一次触发pageshow时,persisted的值一定是false,而在第一次触发pagehide时,persisted就会变成true(除非页面不会保存在bfcache中)。
指定了onunload事件处理程序的页面会被自动排除在bfcache之外,即使事件处理程序是空的。
具体原因:
onunload最常用于撤销在onload中所执行的操作,而跳过onload后再次显示页面很可能会导致页面不正常。