7

我有一个 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() 在谷歌分析调用后不起作用?

4

3 回答 3

2

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 可能影响历史堆栈之前先执行。

于 2012-07-24T00:08:12.177 回答
1

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

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

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

于 2012-07-23T21:53:22.743 回答
1

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

于 2012-07-23T20:37:42.360 回答