[英]IOS 10.3.3 Iphone Safari beforeunload, unload, pagehide wont work
[英]Time to fire for beforeunload vs. pagehide on iOS
我正在使用beforeunload
事件作为代理来了解有关我的网站点击的指标。 例如,如果在click
事件后的约50ms内触发beforeunload
,则可以确定用户何时选择了链接。
对于iOS,这变得很复杂,因为它不支持beforeunload
。 根据Apple文档,我已经将pagehide
替换为beforeunload
,但这没有相同的功能。 好像pagehide
替换了unload
-NOT beforeunload
。 在我的测试中,它们的触发时间平均相差约1500ms( pagehide
触发要比beforeunload
迟得多)。 这使得将pagehide
事件归因于点击非常困难。
iOS上Safari所支持的事件是否可以接近beforeunload
的触发时间?
注意:我知道这不是理想的选择,还有其他更好的方法可能会最终使用,但是我对此仍然感到好奇。
从理论上讲, pagehide
可以代替beforeunload
中的beforeunload
,但实际上不是。 正确观察到的触发pagehide
事件的时间可能会有所不同,因为safari在后台获取新页面,并且当页面可用时将触发pagehide
。
如果您正在寻找一个事件,则不会发生任何事件,但是,一旦单击发生,Safari就会停止运行requestAnimationFrame
,您可以尝试使用这种hack。 因此,您可以尝试类似的操作,在单击发生时记录clickTs
并开始在requestAnimationFrame
函数中记录时间戳,现在,当pageHide
触发时,您只需检查一下clickTs
和eventlastReqAnimTime
之间的时间差,应该大约在500毫秒之间。 这样,您就可以将click
归因于pageHide
var w = window,
reqAnim = null,
clickTs = 'record this when click happens',
eventlastReqAnimTime = +new Date,
logReqAnim = function() {
eventlastReqAnimTime = +new Date;
reqAnim = w.requestAnimationFrame(logReqAnim)
};
reqAnim = w.requestAnimationFrame(logReqAnim);
setTimeout(function () {
w.cancelAnimationFrame(reqAnim);
}, 1500)
w.addEventListener('pagehide', function(){
if(Math.abs(clickTs - eventlastReqAnimTime) < 500 ){
console.log('your link was chosen')
}
})
注意:以上代码只是伪代码,请在运行前进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.