详解如何探测小程序返回到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 相关文章推荐
JS面向对象编程 for Cookie
Sep 19 Javascript
JS简单的轮播的图片滚动实例
Jun 17 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
JS前端笔试题分析
Dec 19 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
Vue2 轮播图slide组件实例代码
May 31 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
小程序实现录音上传功能
Nov 22 Javascript
JS删除对象中某一属性案例详解
Sep 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
php图片验证码代码
2008/03/27 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
xmlHTTP实例
2006/10/24 Javascript
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
JS交换变量的方法
2015/01/21 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
基于python 字符编码的理解
2017/09/02 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
理发店策划方案
2014/06/05 职场文书
高中教师个人总结
2015/02/10 职场文书
世界文化遗产导游词
2015/02/13 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
Python日志模块logging用法
2022/06/05 Python