需求

有三个页面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实现)的更多相关文章

  1. js返回上一页并刷新的多种方法

    js返回上一页并刷新的几种方法.参考链接:http://www.jbxue.com/article/11230.html <a href="javascript:history.go( ...

  2. 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    高并发分布式系统中生成全局唯一(订单号)Id   1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...

  3. js返回上一页并刷新的多种实现方法

    <a href="javascript:history.go(-1)">返回上一页</a> <a href="javascript:loca ...

  4. js返回上一页并刷新代码整理

    一:JS 重载页面,本地刷新,返回上一页 复制代码 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> ...

  5. js返回上一页并刷新、返回上一页、自动刷新页面

    一.返回上一页并刷新 <a href="javascript:" onclick="self.location=document.referrer;"&g ...

  6. JS返回上一页并刷新

    window.history.go(-1);//返回上一页不刷新 window.location.href = document.referrer;//返回上一页并刷新

  7. js返回上一页并刷新的几种方法

    1.返回上一页 1)<a href="javascript:history.go(-1)"></a> 2)<a href="javascri ...

  8. js 返回上一页和刷新

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  9. JS 返回上一页并刷新代码整理

    一:JS 重载页面,本地刷新,返回上一页: <a href="javascript:history.go(-1)">返回上一页</a> <a href ...

  10. Js返回上一页,刷新页面,定时刷新,改变地址栏 等常用实用技巧

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

随机推荐

  1. NBU 还原windows ORACLE数据库(EC)

    rman target / startup nomount; run{ allocate channel ch00 type 'SBT_TAPE'; send 'nb_ora_serv=nbumast ...

  2. 中国大陆被SCI收录的较高影响力期刊

    1.清华主办的期刊Nano Research 清华新闻网2012年9月10日电:据汤森路透公司公布的2011年SCI期刊影响因子,清华大学主办的期刊Nano Research(纳米研究)的影响因子为6 ...

  3. 基于Web Service的客户端框架搭建二:数据转换层(FCL)

    引言 要使用WebService来分离客户端与服务端,必定要使用约定好两者之间的数据契约.Json数据以其完全独立于语言的优势,成为开发者的首选.C# JavaScriptSerializer为Jso ...

  4. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  5. .NET基础 (18)特性

    特性1 什么是特性,如何自定义一个特性2 .NET中特性可以在哪些元素上使用3 有哪几种方法可以获知一个元素是否申明某个特性4 一个元素是否可以重复申明同一个特性 特性1 什么是特性,如何自定义一个特 ...

  6. polymer-quick tour of polymer

    注册一个元素 <link rel="import" href="bower_components/polymer/polymer.html">//没 ...

  7. 更改SQL Server中默认备份文件夹

    当你安装SQL Server时,安装路径一般如下:C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL.在这个目录下也有数据文件的文件夹和备份文件的文 ...

  8. Java Web系列:JDBC 基础

    ADO.NET在Java中的对应技术是JDBC,企业库DataAccessApplicationBlock模块在Java中的对应是spring-jdbc模块,EntityFramework在Java中 ...

  9. 切图,css注意事项

    1.文字尽量不要独立放在div中,一般放在p,span中(显得不专业) 2.div给了width就不要用padding-left,padding-right:给了height就不给padding-to ...

  10. mysql 主从日志文件mysql-bin文件清除方法

    默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题,不建议使用rm命令删除,这样有可能会不安全,正确的方法 ...