是时候在iOS上使用fronthload和pagehide了

时间:2017-06-20 14:21:34

标签: javascript ios events safari onbeforeunload

我正在使用beforeunload事件作为代理我网站点击量指标的方法。例如,如果beforeunloadclick事件的约50毫秒内触发,我可以确定用户何时选择了链接。

iOS变得复杂,因为它不支持beforeunload。根据Apple文档,我已将pagehide替换为beforeunload,但这不具有相同的功能。看起来好像pagehide取代了unload - NOT beforeunload。在我的测试中,他们的射击时间平均相差约1500毫秒(pagehide触发的时间远远晚于beforeunload)。这使得pagehide事件归因于点击非常困难。

iOS上的safari支持哪些事件可以接近beforeunload的触发时间?

注意:我知道这不太理想,还有其他更好的方法,我可能会最终追求,但我仍然对此感到好奇。

1 个答案:

答案 0 :(得分:2)

理论上pagehide是Safari中beforeunload的替代品,但实际上并非如此。正确观察到触发pagehide事件的时间可能会有所不同,因为Safari会在后台抓取新页面,当页面可用时会触发pagehide

如果您正在寻找一个没有事件,但是只要点击发生safari停止运行requestAnimationFrame ,就会有这样的黑客攻击。所以你可以尝试这样的事情,因为点击发生记录clickTs并开始在requestAnimationFrame函数内记录时间戳,现在当pageHide触发时你只需检查clickTseventlastReqAnimTime之间的时差。 click,它应该大约在500毫秒之间。这样,您可以将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') } })

var textx = $(this).text(); 
$('.dropbtn').text(textx);

注意:上面的代码只是伪,运行前测试。