JS 返回上一页并刷新,但不用重新加载整个页面(ajax实现)
需求
有三个页面A、B、C,点击A=>B,点击B=>C,在C中添加内容,点击确定返回到B,此时B页面需重新加载新的内容。再次点击B的返回按钮,希望返回到A而不是C。
===== 2017/5/10 更新 ======
IOS 浏览器的诡异表现:history.go(-1)返回上一页后,页面内容并不会刷新。在C页面添加的内容,返回到B时并没有更新新的内容,必须手动刷新。
经过debug,发现在ios浏览器中,返回上一页后,页面的 JS 代码并未执行。我们猜测可能是缓存引起的,于是使用 meta 禁止了缓存,但仍然没有效果。于是进一步猜测可能是浏览器内部机制导致——ios为了提升浏览网页的效率,可能给已浏览过的网页添加一个类似快照的东西,当点击返回按钮后,直接调用快照展示给用户,省去了执行JS这一步骤(纯静态文件依然被缓存)。
于是想到一个hack方法:
//C页面
sessionStorage.setItem('isHistory', 'true');
// B页面
if(navigator.userAgent.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ )) {
var timer = setInterval(function(){
if(sessionStorage.getItem('isHistory') == 'true') {
sessionStorage.setItem('isHistory', 'false');
timer = null;
location.reload();
}
},30);
}
===== end =====
分析需求
显然,此需求有两个功能:
- 页面中的返回上一页功能
- C中添加内容,返回B后刷新页面,同时保证B页面返回功能的正常使用
解决方案
针对第一个问题,我们很容易想到history.back()或者history.go(-1)
难点在第二个问题,最开始我是这样解决的:loacation.href = document.referrer,此时,B页面内容正确显示,但点击返回按钮却到了C。
分析原因,原来是loacation.href相当于重新加载了一次B页面,那么当前B页面的上一页自然就是C了。
有没有办法使得B页面不重新加载,但更新内容呢?
使用Ajax!!!浏览器加载页面后,会缓存HTML,每次加载页面都会执行一遍JS
1、C 页面点击确定后使用history.go(-1),返回到B页面
2、在 B 页面通过$.ajax()获取内容
var xhr = $.ajax({
type: 'GET',
url: '/api/xxx/xx',
timeout: 5000,
dataType: 'json',
beforeSend: function(XHR){
// todo
},
success: function(json){
//
},
error: function(){},
complete: function(xhr,status){}
})
3、重点,使用自执行函数渲染页面
<script>
function B(){};
B.prototype.getData(){
var xhr = $.ajax({...})
};
B.prototype.renderPage(){
this.getDate();
// render...
};
!function(window){
var b = new B();
b.renderPage();
}(window)
</script>
这下应该成了吧。NO! C点击确定后返回到B,B内容依然没有更新。。。
这是为什么呢?
百度搜索无果,情急之下只有求救大神
大神说,可能是GET请求发出后,由于URL没有变化,浏览器可能会从缓存中读取数据而导致内容更新失败。
- 使用POST请求,强制从服务器获取数据
- 仍然使用GET,改变当前页面的
url,方法是在url末尾添加一段随机字符串
两种方法都能实现需求,这里再说说方法二:
var xhr = $.ajax({
type: 'GET',
url: '/api/xxx/xx',
timeout: 5000,
dataType: 'json',
data: {flag: new Date().getTime().toString(36)}, // 在GET方法内添加一个任意key,随机字符串改变
beforeSend: function(XHR){
// todo
},
success: function(json){
//
},
error: function(){},
complete: function(xhr,status){}
})

JS 返回上一页并刷新,但不用重新加载整个页面(ajax实现)的更多相关文章
- js返回上一页并刷新的多种方法
js返回上一页并刷新的几种方法.参考链接:http://www.jbxue.com/article/11230.html <a href="javascript:history.go( ...
- 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...
- js返回上一页并刷新的多种实现方法
<a href="javascript:history.go(-1)">返回上一页</a> <a href="javascript:loca ...
- js返回上一页并刷新代码整理
一:JS 重载页面,本地刷新,返回上一页 复制代码 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> ...
- js返回上一页并刷新、返回上一页、自动刷新页面
一.返回上一页并刷新 <a href="javascript:" onclick="self.location=document.referrer;"&g ...
- JS返回上一页并刷新
window.history.go(-1);//返回上一页不刷新 window.location.href = document.referrer;//返回上一页并刷新
- js返回上一页并刷新的几种方法
1.返回上一页 1)<a href="javascript:history.go(-1)"></a> 2)<a href="javascri ...
- js 返回上一页和刷新
1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...
- JS 返回上一页并刷新代码整理
一:JS 重载页面,本地刷新,返回上一页: <a href="javascript:history.go(-1)">返回上一页</a> <a href ...
- Js返回上一页,刷新页面,定时刷新,改变地址栏 等常用实用技巧
1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...
随机推荐
- ETL数据仓库
http://blog.csdn.net/leicool_518/article/category/3058299 http://bbs.csdn.net/topics/390349305
- mybatis框架入门程序:演示通过mybatis实现数据库的删除操作
1.mybatis的基本配置工作可以在我的这篇博客中查看:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2.删除用户的映射文件: <!-- ...
- mybatis框架入门程序:演示通过mybatis实现数据库的插入操作中实现返回结果的获取
1.mybatis实现数据库的插入操作可以查看https://www.cnblogs.com/wyhluckdog/p/10149895.html这篇博文,这里面的插入操作没有返回结果,所以这篇博文就 ...
- python全栈考试
1.执行 Python 脚本的两种方式 shell直接调用python脚本 python run.py 调用解释器来调用脚本 2.2.简述位.字节的关系 每8个位bit,组成一个字节byte. 一个 ...
- boost之date_time库
最近开了boost库的学习,就先从日期时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的.以下算是我学习的笔记,我把它记录下来,以后便于我复习和查阅. #inclu ...
- Appium之uiautomator定位元素
元素定位方式有多种,Android也有自身独有的定位方式.下面就单独介绍其基于uiautomator定位元素的方法: 基本语法: driver.find_element_by_android_uiau ...
- Websocket出现的错误
前端使用sockjs,后台使用spring的websocket框架 结果在一个网络较慢的地方,发现tomcat报错信息: Oct 28, 2015 10:10:43 AM org.apache.cat ...
- FMX.Platform.TApplicationEvent
FMX.Platform.TApplicationEvent http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Platform.TApp ...
- 自我介绍及注册github和上传文件
自我介绍: 周侃 年龄20 喜好:玩游戏,赚钱,交际 理想:想要改变中国手游界颓靡的时代,让它进入新次元. 注册github,以及上传文件: 今天给大家来讲解下如何注册githup 当我们打开gith ...
- linux apache安装https证书
1.首先查看是否安装apache 命令:rpm -qa|grep httpd 如果存在,卸载命令:rpm -e XXXX 如果不存在,安装命令:yum install httpd 安装完apache之 ...