繁体   English   中英

是时候触发iOS上的beforeunload和Pagehide了

[英]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触发时,您只需检查一下clickTseventlastReqAnimTime之间的时间差,应该大约在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM