将Google Analytics集成到GWT应用程序中

16

这应该很简单,但我无论尝试什么都无法让它正常工作。我正在尝试在GWT应用程序中使用Google Analytics。根据我所理解的,有两种方法可以实现:

第一种是同步方式,通过在HTML页面的<head>部分末尾插入跟踪代码,然后调用此方法:

public static native void recordAnalyticsHit(String pageName) /*-{
    pageTracker._trackPageview(pageName);
}-*/;

其次是异步方式,通过在 <body> 标签后立即插入跟踪代码,然后调用此方法:

public static native void recordAnalyticsHit(String pageName) /*-{
    _gaq.push(['_trackPageview(' + pageName + ')']);
}-*/;

然而, 当我运行这些方法时,我在托管模式下得到了这个异常:

[ERROR] [myproject] Uncaught exception escaped
com.google.gwt.core.client.JavaScriptException: (ReferenceError): pageTracker is not defined

[ERROR] [myproject] Uncaught exception escaped
com.google.gwt.core.client.JavaScriptException: (ReferenceError): _gaq is not defined

在使用Firebug观察网站时,我发现ga.js被加载了,但仅此而已。

有人用GWT成功运行过Analytics吗?此外,_gaq是否接受页面名称作为trackPageview参数,因为我看到的所有示例都使用这个调用:

_gaq.push(['_trackPageview()']);

(当然,这对我也不起作用。)


4
只是让你知道,_gaq.push(['_trackPageview()']) 是 Google 文档中的一个错误。正确的写法应该是 _gaq.push(['_trackPageview']),不需要括号。 - Brian
1
你可以使用 gwt-gatracker(https://code.google.com/p/gwt-gatracker/)来使你的生活更加轻松。 - Sameeh Harfoush
2个回答

23

这只是一个猜测,但你可能需要在JSNI中通过$wnd引用托管页面(包含Google Analytics JS代码的页面),像这样:

public static native void recordAnalyticsHit(String pageName) /*-{
    $wnd.pageTracker._trackPageview(pageName);
}-*/;

JSNI代码(以及总体上的GWT代码)在iframe中运行,以保持命名空间的清洁,这就是为什么需要$wnd引用主窗口的原因。


1
当然,这也适用于GA异步:$wnd._gaq.push(['_trackPageview',pageName]); - Brian

0
<script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

<script type="text/javascript">
   var pageTracker = _gat._getTracker("UA-xxxxxx-x");
   pageTracker._trackPageview("/subdirectory/pagename");
</script>

请参阅http://www.google.com/support/analytics/bin/answer.py?hl=zh-cn&answer=55485了解详情。


Antonio,请您详细说明一下您的答案?问题是关于如何从Java GWT代码中调用Google Analytics。 - Domchi
实际上我只想说两件事:1)在GWT代码调用之前,应该包含ga.js; 2)"$ wnd.pageTracker._trackPageview(pageName);" 对我不起作用,我不得不使用我在官方Google FAQ中找到的代码。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接