【问题标题】:Uncaught ReferenceError: _gaq is not defined (Google Analytics)未捕获的 ReferenceError: _gaq 未定义 (Google Analytics)
【发布时间】:2016-01-04 16:37:32
【问题描述】:

在 chrome 调试日志中查看站点页面时会出现以下消息。

未捕获的引用错误:_gaq 未定义

页面本身应该使用onload 事件处理程序跟踪对象,并为Google Analytics 触发_trackEvent

我最好的猜测是ga.js 文件可能没有及时加载,因此触发的onload _trackEvent 没有被捕获。 async sn-p 在</body> 关闭之前使用,对象位于<body> 中间。

(其他一些帖子也引用了 jQuery 位置,但这可能是一个红鲱鱼)

非常感谢任何帮助。

【问题讨论】:

    标签: google-analytics onload-event


    【解决方案1】:

    https://developers.google.com/analytics/devguides/collection/gajs/ 开始,此代码将您现有的“传统 sn-p”替换为“最新的异步版本,您应该先删除现有的跟踪 sn-p”。

    <script type="text/javascript">
    
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-XXXXX-X']);
      _gaq.push(['_trackPageview']);
    
      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    
    </script>
    

    要查看您的事件(以了解这是否有效),请在“报告”页面左侧的“实时”菜单选项下查找“事件”。

    【讨论】:

    • 这是一个更好的答案,并且包含一个封装的解决方案 - 当上下文没有留给想象时,我总是很感激。
    【解决方案2】:

    关于异步 sn-p 的位置,GA help page 表示 -

    将此 sn-p 粘贴到您的网站模板页面中,使其显示 在结束 &lt;/head&gt; 标记之前。

    我的第一个想法是应该在页面底部加载JS以提高页面速度。但是,GA 异步跟踪 sn-p 应该加载到头部,因为它不会立即加载 ga.js,也不会阻止页面执行。(它通过将脚本标签动态添加到 DOM 来做到这一点,它将它放在队列的后面。)

    如果由于某种原因无法将 async sn-p 移到头部,则可以自己定义_gaq,如下所示-

    <button onclick="var _gaq = _gaq || []; _gaq.push(['_trackEvent', 'button3', 'clicked'])"/><button>
    

    【讨论】:

    • 这正是我的问题。我将跟踪代码移到页脚,甚至没有意识到它是使用异步加载的。感谢您的提示!
    【解决方案3】:

    遇到了同样的问题。您必须定义 _gaq 数组。只需在标题中的 Google Analytics 脚本之后添加:

    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-XXXXXX-X']);
    _gaq.push(['_trackPageview']);
    

    【讨论】:

      【解决方案4】:

      您可以使用最新版本的analytics.js 代替ga.js

      ga.js 是一个遗留库。如果您要开始新的实施,我们 推荐你使用这个库的最新版本,analytics.js。 对于现有实现,了解如何从 ga.js 迁移到 分析.js。

      这是一个例子:

      ga('send', {
        hitType: 'event',
        eventCategory: 'Video',
        eventAction: 'play',
        eventLabel: 'cats.mp4'
      });
      

      【讨论】:

      • 这对我有用。我不会更改为其他解决方案。由于我的 ga 版本不使用 _gaq
      【解决方案5】:

      将跟踪代码更改为:

      <script type="text/javascript">
            var gaq; 
            var _gaq = gaq || [];
            _gaq.push(['_setAccount', 'UA-XXXXX-X']);
            _gaq.push(['_setDomainName', 'yourdomain.com']);
            _gaq.push(['_setAllowLinker', true]);
             _gaq.push(['_trackPageview']);
      
            (function() {
              var ga = document.createElement('script');
              ga.type = 'text/javascript';
              ga.async = true;
              ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www')
                            + '.google-analytics.com/ga.js';
              var s = document.getElementsByTagName('script')[0];
              s.parentNode.insertBefore(ga, s);
            })();
      
      </script>
      

      【讨论】:

      • 我不太明白这将如何工作。 _gaq 不会总是设置为您刚刚在第一行启动的gaq 变量吗?
      • 这确保了新 GA 的干净开始。如果你想使用另一个现有的 _gaq,你可以。 var _gaq = _gag 将引用它(如果现有的是一个数组,一切都会好的。如果它不是一个数组,你会得到一个错误)。在上面的代码中, _gaq 虽然引用了 gaq(新变量),但将是一个数组。看看吧。
      • 既然你知道gaqundefined,你的前两行可以合并成_gaq = []。如果您尝试获取现有阵列或设置新阵列,那么您将使用传统的_gaq = _gaq || []。如果_gaq 已经存在,那么你就杀了它。第二行实际上是_gaq = undefined || new Array,在这种情况下,它将始终设置为等于一个数组。
      猜你喜欢
      • 2012-09-12
      • 2020-10-04
      • 2015-12-18
      • 1970-01-01
      • 2023-01-23
      • 2019-03-22
      • 2016-11-03
      • 2011-01-05
      • 2016-01-02
      相关资源
      最近更新 更多