详解如何探测小程序返回到webview页面


Posted in Javascript onMay 14, 2019

在公司项目中经常会遇到一个场景, 尝试过各种不同的方法, 最后想到了一种很技术上简单且可行的方法.

经常被QA同学反应同一类型的问题

项目是小程序(wepy), 部分页面使用webview(vue). 经常会遇见一个场景: 当小程序navigateTo到一些页面对用户的"收藏状态", "身材细节"做了修改后, 用户点击返回按钮回到上一个页面, 收藏的状态或是身材细节没有改变.

那是当然的, 作为一个小程序中的webview, api相当有限, 没有一个事件可以让网页触发重新渲染动作, 轮询更是不理智的表面功夫.

我们试过绑定blur和click事件来模拟事件, 试过从业务逻辑上加入一些时间点检查状态, 最后才想到个技术简单, 操作简单的解决方案.

解决方法

第一步, 在小程序webview绑定的url上加上时间戳.

<web-view src="{{url}}"/>
onShow () {
 this.url = ${base_url}?ts=Date.now()
}

第二步, 在html里监听query变化. 我遇到问题的项目使用的是vue.

watch: {
  '$route.query.ts': function () {
  this.fetchData()
  this.patchRender() // 获取数据, 重新渲染变化的部分
  }
 }

这样就解决了触发退回到webview的事件探测问题, 剩下的只要根据业务来重新渲染可能变化的部分就行了.

更多

小程序的部分每次都需要改变url的query参数没有办法, 但是对vue设计这么良好的框架还有一定改良空间.

我们可以把这串代码写到mixin里, 对性能有些小影响, 但方法没写也不会去执行, 只是在不需要的页面上多了个observer.

Vue.use(function () {
 Vue.mixin({
 watch: {
  '$route.query.ts': function () {
  this.$options.onShow && this.$options.onShow.call(this)
  }
 }
 })
})

那么在vue页面中就省去了写watch的麻烦, 直接像小程序那样写onShow方法就行了.

onShow () {
 this.fetchData()
 this.patchRender() 
 },
 methods: {
 fetchData () {//...}
 }

总结, 使用了这个方法如需再添加需要探测onShow事件的页面, 只需要:

小程序webview的url在onShow的时候修改ts参数

在vue文件里添加onShow方法, 进行业务操作. (方法里的this是正常指向vm的)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
javascript Math.random()随机数函数
Nov 04 Javascript
javascript写的日历类(基于pj)
Dec 28 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
JavaScript中标识符提升问题
Jun 11 Javascript
javascript设计简单的秒表计时器
Sep 05 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
Bootstrap栅格系统学习笔记
Nov 25 Javascript
Ajax和Comet技术总结
Feb 19 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 #jQuery
javascript实现遮罩层动态效果实例
May 14 #Javascript
JQuery animate动画应用示例
May 14 #jQuery
微信小程序的线程架构【推荐】
May 14 #Javascript
jquery实现选项卡切换代码实例
May 14 #jQuery
Vue表单之v-model绑定下拉列表功能
May 14 #Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 #jQuery
You might like
php分页示例代码
2007/03/19 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php绘制圆形的方法
2015/01/24 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
python判断完全平方数的方法
2018/11/13 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
keras 权重保存和权重载入方式
2020/05/21 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
个人借款担保书
2014/04/02 职场文书
机械专业求职信范文
2014/07/15 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
单位委托书
2014/10/15 职场文书
话题作文之学会尊重
2019/12/16 职场文书