Google Analytics 会干扰 Android 浏览器中的 history.back() 吗?

Posted

技术标签:

【中文标题】Google Analytics 会干扰 Android 浏览器中的 history.back() 吗?【英文标题】:Google Analytics interferes with history.back() in android browser? 【发布时间】:2011-12-27 11:50:07 【问题描述】:

我有一个 html5 移动应用程序,其中所有内容都存在于一个页面上,我使用 history.back/popstate/etc 来更改页面的内容(通过 jQuery Mobile)。我正在使用 Google Analytics 跟踪各种事件,并在一个页面上跟踪用户是否通过特定按钮退出:

$('#my-back-button').bind('tap', function() 
    _gaq.push(['_trackEvent', 'mycategory', 'myaction']);
    history.back();
    return false;
);

android 2.2 浏览器中,history.back() 被调用但 onpopstate 没有被触发并且页面没有改变。如果我将 window.onpopstate = function() alert("!"); ; 放在 history.back() 之前,我看不到任何警报。

如果我颠倒这两行(首先是history.back(),然后是_gaq.push),它似乎可以工作,但我不能在我的代码中依赖这种排序。

没有抛出异常。它在 ios 和桌面 Chrome 中运行良好。

任何想法为什么 history.back() 在谷歌分析调用后不起作用?

【问题讨论】:

我遇到了完全相同的问题。自从本月前第一次发布以来,我认为您没有提出解决方案或解决方法,是吗? 抱歉,我没有找到解决方法。我们最终只是停止使用谷歌分析,并且避免将代码放在 history.back() 附近。 我不记得有同样的问题,但是通过 javascript 查看我构建的 HTML5 应用程序(现在是一年半前),我通过一个函数将调用委托给 Google Analytics在需要它的其他函数/调用结束时调用。 使用 window.onhashchange 代替 window.onpopstate 有什么改变吗? @RTB 【参考方案1】:

尝试将调用 _gaq.push() 封装在 0 的异步超时中:

$('#my-back-button').bind('tap', function() 
    setTimeout(function() 
         _gaq.push(['_trackEvent', 'mycategory', 'myaction']);
    , 0);
    history.back();
    return false;
);

这将允许 history.back() 在 Google Analytics 可能影响历史堆栈之前首先执行。

【讨论】:

这对我有用,非常好。 @DurhamG 可以确认这是否也适用于他吗?然后我会给你奖金。【参考方案2】:

嗯,好吧,真的很讨厌:如果您将 _gaq.push() 包装到一个新函数中并将 history.go() 留在原处会发生什么?

【讨论】:

【参考方案3】:

也许对谷歌分析的调用会在历史堆栈中添加一个新条目,而 history.back() 只会将您带到您当前所在的页面。

或者 GA 为历史提供了一个新的范围。

尝试调用 history.back() 两次或使用 top.history.back() 或 window.history.back() 或 self.history.back()

【讨论】:

以上是关于Google Analytics 会干扰 Android 浏览器中的 history.back() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我更改了网站软件,需要在Google Analytics网站搜索的网址中找到使用查询字符串的替代方法

Google Analytics会查看所有原始请求

测试Google广告和Google Analytics脚本会显示空白页面

为啥推迟开始日期会导致 Google Analytics(分析)报告查询返回 0 结果?

Google Analytics(分析) - 目标渠道步骤

当用户不在线时,Google Analytics 是不是会离线存储数据?