前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信浏览器中reload()无法完成刷新页面的解决方案

微信浏览器中reload()无法完成刷新页面的解决方案

作者头像
WindCoder
发布2018-09-20 16:17:36
5.2K0
发布2018-09-20 16:17:36
举报
文章被收录于专栏:WindCoderWindCoder

问题背景

今天有一个刷新的需求,先后使用了reload()、replace 方法以及window.location.href三种方式,结果都只是在pc端没问题,移动端微信中浏览失败。之后在相应js中加了alert事件,结果发现仅在第一次进入页面时执行了,再次刷新时并未执行,故目前怀疑是微信中默认缓存了静态资源。

至于用怀疑一词,是由于在网上找了好久,基本都只说了方案,对于产生原因却很少有人提及,另根据reload()的说明,当有参数true时(即reloa(true)),浏览器应当已经绕过缓存重新从服务器获取了一份,但实际在微信中浏览发现js文件依旧未重新执行,故目前仅是怀疑状态,尚未找到真正原因所在。

解决方案

目前使用的解决方案为在地址后面添加随机数,从而欺骗浏览器url改变了,使其向服务器发送请求而不去读缓存。

实现代码

代码语言:javascript
复制
var len = window.location.href.indexOf("?");
if(len>0){
	window.location.href=window.location.href.substring(0,len)+"?"+Math.random();
}else{
	window.location.href=window.location.href+"?"+Math.random();
}

代码注释:

先创建一个len用来存储地址中?的位置,当大于0,说明不是第一次进入,故截取出当前地址并在后面拼接随机数,反之直接拼接随机数。具体使用方式请根据个人需求自行修改。

课外延伸

1、页面刷新

reload 方法

该方法强迫浏览器刷新当前页面。

语法
代码语言:javascript
复制
location.reload(force)
说明

如果该方法没有规定参数,或者参数是 false,它就会用 HTTP 头 If-Modified-Since 来检测服务器上的文档是否已改变。如果文档已改变,reload() 会再次下载该文档。如果文档未改变,则该方法将从缓存中装载文档。这与用户单击浏览器的刷新按钮的效果是完全一样的。

如果把该方法的参数设置为 true,那么无论文档的最后修改日期是什么,它都会绕过缓存,从服务器上重新下载该文档。这与用户在单击浏览器的刷新按钮时按住 Shift 健的效果是完全一样。

replace 方法
语法
代码语言:javascript
复制
location.replace(newURL)
说明

replace() 方法不会在 History 对象中生成一个新的记录。当使用该方法时,新的 URL 将覆盖 History 对象中的当前记录。

该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过“前进”和“后退”来访问已经被替换的URL。

实际应用场景

(此处来源网络,请酌情参考)

在实际应用的时候,重新刷新页面的时候,我们通常使用: location.reload() 或者是 history.go(0) 来做。

因为这种做法就像是客户端点F5刷新页面,所以页面的method="post"的时候,会出现"网页过期"的提示。那是因为Session的安全保护机制。

可以想到: 当调用 location.reload() 方法的时候, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。

如果有这种应用: 我们需要重新加载该页面,也就是说我们期望页面能够在服务端重新被创建, 我们期望是 Not IsPostback 的。这里,location.replace() 就可以完成此任务。被replace的页面每次都在服务端重新生成。

2、字符串截取

substring() 方法

substring() 方法用于提取字符串中介于两个指定下标之间的字符

语法
代码语言:javascript
复制
stringObject.substring(start,stop)

参数

描述

start

必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。

stop

可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。 如果省略该参数,那么返回的子串会一直到字符串的结尾。

返回值

一个新的字符串,该字符串值包含 stringObject 的一个子字符串,其内容是从 start 处到 stop-1 处的所有字符,其长度为 stopstart

说明

substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。

如果参数 startstop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 startstop 大,那么该方法在提取子串之前会先交换这两个参数。

提示和注释

重要事项:与 slice() 和 substr() 方法不同的是,substring() 不接受负的参数。

substr() 方法

substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

语法

stringObject.substr(start,length)

参数

描述

start

必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。

length

可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。

返回值

一个新的字符串,包含从 stringObjectstart(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 startstringObject 的结尾的字符。

提示和注释

注释:substr() 的参数指定的是子串的开始位置和长度,因此它可以替代 substring() 和 slice() 来使用。

重要事项:ECMAscript 没有对该方法进行标准化,因此反对使用它。

重要事项:在 IE 4 中,参数 start 的值无效。在这个 BUG 中,start 规定的是第 0 个字符的位置。在之后的版本中,此 BUG 已被修正。

slice() 方法

slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。

语法
代码语言:javascript
复制
stringObject.slice(start,end)

参数

描述

start

要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。

end

紧接着要抽取的片段的结尾的下标。若未指定此参数,则要提取的子串包括 start 到原字符串结尾的字符串。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。

返回值

一个新的字符串。包括字符串 stringObject 从 start 开始(包括 start)到 end 结束(不包括 end)为止的所有字符。

说明

String 对象的方法 slice()、substring() 和 substr() (不建议使用)都可返回字符串的指定部分。

slice() 比 substring() 要灵活一些,因为它允许使用负数作为参数

slice() 与 substr() 有所不同,因为它用两个字符的位置来指定子串,而 substr() 则用字符位置和长度来指定子串。

还要注意的是,String.slice() 与 Array.slice() 相似。

参考资料

解决微信浏览器无法使用reload()刷新页面

HTML DOM reload() 方法

HTML DOM replace() 方法

JS刷新当前页面的几种方法总结

JavaScript substring() 方法

JavaScript substr() 方法

JavaScript slice() 方法

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景
  • 解决方案
  • 课外延伸
    • 1、页面刷新
      • reload 方法
      • replace 方法
      • 实际应用场景
    • 2、字符串截取
      • substring() 方法
      • substr() 方法
      • slice() 方法
  • 参考资料
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档