这是我参与8月更文挑战的第 2 天,活动详情查看: 8月更文挑战html
赠人玫瑰,手有余香。先点赞,再查看哇。ios
最近产品须要作一个埋点,不管是预览商品仍是预览企业信息都须要统计改用户停留的时长,可是这个里有个特色,就是商品和企业信息都是用H5写的,最终这个H5页面会嵌套自家产品小程序和本身产品安卓端和IOS端,因为嵌套的缘由,须要处理的东西确实会比较复杂,而且仍是嵌套到三个不一样的宿主环境里,想一想都会头疼,这样会致使有些事件H5是没法监听到的。web
navigator.sendBeacon
发送接口及window.addEventListener('unload', function(){}, false)
来监听是否关闭浏览器,更多详情点我(new Date).getTime()
把它保存到全局,如何在要调接口统计时长时,咱们在(new Date).getTime()
弄一个时间戳减去进来时保存的时间戳便可获得一个预览时间,这里相减是毫秒,本身转化下便可。visibilitychange
,这个时间能够监听页面是否隐藏,下面咱们详细介绍:当其选项卡的内容变得可见或被隐藏时,会在文档上触发 visibilitychange
(能见度更改)事件。小程序
当 visibleStateState 属性的值转换为
hidden
时,Safari不会按预期触发visibilitychange
; 所以,在这种状况下,您还须要包含代码以侦听pagehide
事件。浏览器
出于兼容性缘由,请确保使用
document.addEventListener
而不是window.addEventListener
来注册回调。 Safari <14.0仅支持前者。服务器
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'visible') {
// 页面被显示
// backgroundMusic.play();
} else {
// 页面被隐藏
// backgroundMusic.pause();
}
});
复制代码
全局设置一个变量用于记录初始时间,当页面隐藏(例如:切换后台)监听到visibilitychange
下的document.visibilityState === 'hidden'
时,咱们就把时间统计发送到服务器;当document.visibilityState === 'visible'
时,咱们又开始新的统计时间,这样就能够精准把须要统计的时间完成到服务器。微信
此时新的问题开始出现了,就是嵌套H5后,在ios系统中,直接点击系统右上角的返回按钮,是没法触发visibilitychange
事件的,这就让咱们很困惑了,有人会提出,那不是能够监听关闭浏览器或者关闭网站事件,不就能够解决?我只能说这些都没法监听的,你想到的事件基本都不会触发H5页面中的因此事件安静的有点可怕,这种状况也只有ios才会出现,安卓手机和鸿蒙手机都不会出现这样的状况。markdown
若是嵌套ios的APP里面,当用户点击左上角返回按钮,由APP生命周期里调用H5方法,在H5中window里挂载本身写好的一个函数,当调用本身挂载的函数时发送统计上传到服务器;ide
若是嵌套到小程序的H5,咱们不能这么写了,由于小程序没办法在页面销毁时调用H5页面的任何东西,这里不止页面销毁调不了H5方法而是任什么时候候都没法调用直接调H5里面的方法,因此这里咱们须要使用微信提供的一个方法wx.miniProgram.postMessage
文档详情,咱们应该怎么合理使用这个方法呢?个人想法是,每此进入须要记录时间的页面使用该方法,把须要上传的参数及时间记录并赋值给wx.miniProgram.postMessage({data:{}})
,如何当用户点击小程序原生返回时,咱们能够在原生里面写一个方法用于接收该参数;函数
<web-view bindmessage="bindmessage"></web-view>
// js
bindmessage(){
// H5页面接收发送回来的参数
}
wx.miniProgram.postMessage({ data: 'foo' })
复制代码
咱们就能够把拿到的参数直接在小程序内完成发送统计;
其实要解决这些问题也不难,难在怎么跳出思惟,不能一成不变的认为只能在H5监听全部事件或者完成全部操做。 回顾一下:咱们使用的主要代码有
// 在H5页面中,监听事件
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'visible') {
// 页面被显示
// backgroundMusic.play();
} else {
// 页面被隐藏
// backgroundMusic.pause();
}
});
// 用于H5页面发送给小程序的内容
wx.miniProgram.postMessage({ data: 'foo' });
// 用于iosAPP端调用的方法
window.logData = function() {};
复制代码
// 小程序原生代码绑定监听H5回传参数
<web-view bindmessage="bindmessage"></web-view>
复制代码
bindmessage(){
// H5页面接收发送回来的参数
}
复制代码
就这些代码,咱们就完成咱们想要的效果了。
创做不易,喜欢记得点赞,若有错误请评论区留言。