小程序内嵌H5一直很坑爹,最近公司有个需求,需要统计用户在页面停留的时长,app和小程序都有内嵌H5的页面。
一开始想到的是window的onbeforeunload事件在页面离开时将页面编码和停留时长等上传服务器,
// 数据埋点
function pageCode(obj){
var pageObj= {};
var times = 0;
var timer = setInterval(function(){
times++;
// (times)
},1000);
= function(){
clearInterval(timer);
// (obj);
pageObj.page_time = times*1000;
pageObj.page_code = (obj);
$.get(url,pageObj,function(data){
(data);
})
}
}
那么问题来了,由于顶部的返回是小程序和app控制的,如果是一级页面,即从小程序打开webview进入的第一个页面,返回时不触发onbeforeunload事件,二级页面返回一级页面时时触发的,这个时候自然想到的是如果是一级页面就通知小程序,让小程序自己做统计,
(function (res) {
({
data: {
times: times,
pageCode:"11111",
type: 1
}
})
})
但是问题又来了,这些页面有可能是一级页面也有可能是二级页面,这就坑爹了吧,然后又想或许能解决,然后悲催的发现,从二级页面返回一级页面时,还是2,不会变成1,心累....
后来想到销毁webview时肯定有方法监听,那只要在销毁时让小程序统计就可以了,那时长怎么算呢?小程序向H5发送消息只能在进入的时候拼在url里,小程序onUnload时可以new个时间,使用bindload绑定onloadSuccess事件,onloadSuccess时也可以new个时间,这样就算出来了,而且确认在二级页面时这个onloadSuccess也是可以触发的,最终的解决方案是进入页面时postMessage,只传pageCode,
(function (res) {
({
data: {
pageCode:"11111",
}
})
})
onbeforeunload事件保留用在页面间的传递,小程序onloadSuccess时newDate,返回小程序首页销毁webview时onUnload再newDate,计算出停留时长并上传。