使用AngularJS跟踪Google Analytics网页浏览量

dj2*_*dj2 220 google-analytics angularjs

我正在使用AngularJS作为前端设置一个新的应用程序.客户端的所有内容都使用HTML5 pushstate完成,我希望能够在Google Analytics中跟踪我的网页浏览量.

dj2*_*dj2 240

如果您ng-view在Angular应用中使用,则可以收听该$viewContentLoaded活动并将跟踪事件推送到Google Analytics.

假设您已在主index.html文件中设置跟踪代码,其名称为var _gaq和MyCtrl是您在ng-controller指令中定义的内容.

function MyCtrl($scope, $location, $window) {
  $scope.$on('$viewContentLoaded', function(event) {
    $window._gaq.push(['_trackPageView', $location.url()]);
  });
}
Run Code Online (Sandbox Code Playgroud)

更新: 对于新版本的谷歌分析使用此版本

function MyCtrl($scope, $location, $window) {
  $scope.$on('$viewContentLoaded', function(event) {
    $window.ga('send', 'pageview', { page: $location.url() });
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 我会使用`$ rootScope.$ on('$ routeChangeSuccess',...)` (123认同)
  • 如果您正在使用GA新脚本,那就是`$ window.ga('send','pageview',{page:$ location.path()});`而不是`$ window._gaq ...`部分.此外,您可能希望从原始GA代码中删除`ga('send','pageview');`以防止首次登陆页面时出现重复. (43认同)
  • FWIW它应该是`_trackPageview`而不是`_trackPageView` ...花了10分钟的头部抓挠:) (12认同)
  • @DavidRivers嗯,已经有一段时间了,但只是看了看这个答案和我的评论,似乎将它应用于`$ rootScope`将保证它不会被其他事件或DOM更改删除,并使用`每次位置栏更改时,routeChangeSuccess`都会触发,而不是只更改视图源模板.那有意义吗? (5认同)
  • 在$ routeChangeSuccess事件期间@ dg988,您可能不知道页面标题的前期(例如,可以在完成从RESTful服务处理数据后在控制器内设置).这种方式单独使用页面的URL,Google Analytics将跟踪上一页的标题. (5认同)

Har*_*rev 57

加载新视图后AngularJS,Google Analytics不会将其视为新的网页加载.幸运的是,有一种方法可以手动告知GA将网址记录为新的网页浏览.

_gaq.push(['_trackPageview', '<url>']); 会做的工作,但如何与AngularJS绑定?

这是您可以使用的服务:

(function(angular) { 

  angular.module('analytics', ['ng']).service('analytics', [
    '$rootScope', '$window', '$location', function($rootScope, $window, $location) {
      var track = function() {
        $window._gaq.push(['_trackPageview', $location.path()]);
      };
      $rootScope.$on('$viewContentLoaded', track);
    }
  ]);

}(window.angular));
Run Code Online (Sandbox Code Playgroud)

定义角度模块时,请包括分析模块,如下所示:

angular.module('myappname', ['analytics']);
Run Code Online (Sandbox Code Playgroud)

更新:

您应该使用新的Universal Google Analytics跟踪代码:

$window.ga('send', 'pageview', {page: $location.url()});
Run Code Online (Sandbox Code Playgroud)

  • 另外需要注意的是,您需要在某处包含"分析"服务.我在app.run做了我的. (6认同)
  • @Designermonkey如果仅将其包含在主应用程序模块中,则它将起作用。如果您有一个完全独立的模块,尽管该模块不需要您的主模块,则可能需要再次添加它。干杯! (2认同)

dpi*_*eda 48

app.run(function ($rootScope, $location) {
    $rootScope.$on('$routeChangeSuccess', function(){
        ga('send', 'pageview', $location.path());
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果使用最小化/编译,则需要指定参数名称:`app.run(["$ rootScope","$ location",function(...` (8认同)

小智 40

只是一个快速添加.如果您正在使用新的analytics.js,那么:

var track = function() {     
 ga('send', 'pageview', {'page': $location.path()});                
};
Run Code Online (Sandbox Code Playgroud)

另外一个提示是Google解析不会在localhost上触发.因此,如果您在localhost上进行测试,请使用以下代替默认创建(完整文档)

ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});
Run Code Online (Sandbox Code Playgroud)

  • 使用ui-router你可以发送如下页面视图:`$ rootScope.$ on('$ stateChangeSuccess',function(event,toState,toParams,fromState,fromParams){ga('send','pageview',{'page ':$ location.path(),'title':toState.name});});` (6认同)
  • 确保使用`$ window`来访问窗口(Angular中的`ga`很可能是'undefined`).此外,您可能希望从原始GA代码中删除`ga('send','pageview');`以防止首次登陆页面时出现重复. (3认同)
  • 要添加:如果您在应用程序中使用搜索参数,则可以使用`$ location.url()`跟踪这些参数 (2认同)
  • 我赞成这个答案因为使用.path()比.url()更好,因为你通常想要排除查询字符串参数.请参阅:[Google Analytics配置错误#2:查询字符串变量](http://cutroni.com/blog/2006/09/21/google-analytics-configuration-mistake-2-query-string-variables/) (2认同)

mgo*_*nto 11

我已经创建了一个服务+过滤器,可以帮助你们这个,如果你选择在将来添加它们,也可以和其他一些提供商一起使用.

查看https://github.com/mgonto/angularytics并告诉我这是如何为您解决的.


Ped*_*pez 10

通过wynnwu和dpineda合并答案对我有用.

angular.module('app', [])
  .run(['$rootScope', '$location', '$window',
    function($rootScope, $location, $window) {
      $rootScope.$on('$routeChangeSuccess',
        function(event) {
          if (!$window.ga) {
            return;
          }
          $window.ga('send', 'pageview', {
            page: $location.path()
          });
        });
    }
  ]);
Run Code Online (Sandbox Code Playgroud)

将第三个参数设置为对象(而不仅仅是$ location.path())并使用$ routeChangeSuccess而不是$ stateChangeSuccess就可以了.

希望这可以帮助.


IBo*_*rap 7

我使用上面的方法在github上创建了一个简单的例子.

https://github.com/isamuelson/angularjs-googleanalytics


ilo*_*ett 5

在您的 中index.html,复制并粘贴 ga 代码段,但删除该行ga('send', 'pageview');

<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-XXXXXXXX-X');
</script>
Run Code Online (Sandbox Code Playgroud)

我喜欢给它自己的my-google-analytics.js带有自注入的工厂文件:

angular.module('myApp')
  .factory('myGoogleAnalytics', [
    '$rootScope', '$window', '$location', 
    function ($rootScope, $window, $location) {

      var myGoogleAnalytics = {};

      /**
       * Set the page to the current location path
       * and then send a pageview to log path change.
       */
      myGoogleAnalytics.sendPageview = function() {
        if ($window.ga) {
          $window.ga('set', 'page', $location.path());
          $window.ga('send', 'pageview');
        }
      }

      // subscribe to events
      $rootScope.$on('$viewContentLoaded', myGoogleAnalytics.sendPageview);

      return myGoogleAnalytics;
    }
  ])
  .run([
    'myGoogleAnalytics', 
    function(myGoogleAnalytics) {
        // inject self
    }
  ]);
Run Code Online (Sandbox Code Playgroud)


小智 5

最好的方法是使用谷歌标签管理器根据历史监听器触发你的谷歌分析标签。这些内置于 GTM 界面中,可以轻松跟踪客户端 HTML5 交互。

启用内置历史变量并创建触发器以根据历史更改触发事件。


Bre*_*rne 5

我发现该gtag()功能有效,而不是ga()功能。

在index.html文件的<head>部分中:

<script async src="https://www.googletagmanager.com/gtag/js?id=TrackingId"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'TrackingId');
</script>
Run Code Online (Sandbox Code Playgroud)

在AngularJS代码中:

app.run(function ($rootScope, $location) {
  $rootScope.$on('$routeChangeSuccess', function() {
    gtag('config', 'TrackingId', {'page_path': $location.path()});
  });
});
Run Code Online (Sandbox Code Playgroud)

替换TrackingId为您自己的跟踪ID。