AngularJSを使用したGoogleアナリティクスのページビューの追跡


221

AngularJSをフロントエンドとして使用して新しいアプリをセットアップしています。クライアント側のすべてがHTML5 pushstateで行われているので、Googleアナリティクスでページビューを追跡できるようにしたいと考えています。



2
angularticsは非推奨です。angular-google-analyticsを
webdev5

5
@ webdev5 Angularticsの新しいバージョンが公開されました。試してみてください:angulartics.github.io
Devner

回答:


240

ng-viewAngularアプリで使用している場合は、$viewContentLoadedイベントをリッスンして、トラッキングイベントをGoogleアナリティクスにプッシュできます。

メインのindex.htmlファイルにトラッキングコードをの名前で設定しvar _gaq、MyCtrlがng-controllerディレクティブで定義したと仮定します。

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

更新: google-analyticsの新しいバージョンでは、これを使用してください

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

12
FWIWそれはあるべきで_trackPageviewありそうではありません_trackPageView...頭を掻くのに10分間費やしました:)
sajal

123
私は使用することになります $rootScope.$on('$routeChangeSuccess', ...)
クマの友達

5
@DavidRiversうーん、久しぶりですが、この回答と私のコメントを見ただけで、それを適用すると、$rootScope他のイベントやDOMの変更によって削除されないことが保証され、使用routeChangeSuccessするたびに起動しますロケーションバーが変わるので、ソースを表示するテンプレートを変更するだけではありません。それは理にかなっていますか?
クマの友だち2013年

5
$ routeChangeSuccessイベント中に@ dg988を使用すると、ページのタイトルが事前にわからない場合があります(たとえば、RESTfulサービスからのデータの処理が完了した後で、コントローラー内に設定できます)。この方法だけで、Google AnalyticsのページのURLが前のページのタイトルを追跡します。
Konstantin Tarkus

43
GAの新しいスクリプトを使用している場合$window.ga('send', 'pageview', { page: $location.path() });は、$window._gaq...パートの代わりです。また、ga('send', 'pageview');最初にページにアクセスしたときに重複を防ぐために、元のGAコードから削除することもできます。
CWSpear 2013

57

新しいビューがに読み込まれるとAngularJS、Googleアナリティクスはそれを新しいページの読み込みとしてカウントしません。さいわい、GAにURLを新しいページビューとして記録するように手動で指示する方法があります。

_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));

角度モジュールを定義するときに、次のように分析モジュールを含めます。

angular.module('myappname', ['analytics']);

更新

新しいユニバーサルGoogleアナリティクストラッキングコードは、次のもので使用する必要があります。

$window.ga('send', 'pageview', {page: $location.url()});

6
ここでもう1つ注意する点は、「分析」サービスをどこかに含める必要があることです。私はapp.runで私の物を作りました。
Nix

これには、すべてのモジュール、または最初のアプリのみを含める必要がありますか?
DesignerMonkey

2
@Designermonkeyメインアプリモジュールだけに含めれば機能するはずです。メインモジュールを必要としない、完全に独立したモジュールがある場合は、再度含める必要がある場合があります。乾杯!
Haralan Dobrev 2014

サービスを使用している場合は、「this」キーワードを使用して関数を定義する必要があります:source。たとえば、サービス内では次のようになります。this.track = function($window.ga('send', 'pageview', {page: $location.url()});これによりgoogleAnalytics.track();app.run()関数内で使用できるようになります
zcoon

48
app.run(function ($rootScope, $location) {
    $rootScope.$on('$routeChangeSuccess', function(){
        ga('send', 'pageview', $location.path());
    });
});

8
注:minimzation /コンパイルを使用する場合は、パラメータ名を指定する必要がありますapp.run(["$rootScope", "$location", function(...
dplass

すべてのコントローラーにGAコードを含めたくない場合、このソリューションは優れています。
breez

1
タイトルを動的に変更する非同期コードがある場合はそれほど優れていませんが、そうでない場合は優れています。
ヨハン

40

簡単な追加です。新しいanalytics.jsを使用している場合:

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

さらに、1つのヒントは、Googleアナリティクスがlocalhostで起動しないことです。したがって、ローカルホストでテストする場合は、デフォルトのcreateの代わりに以下を使用してください(完全なドキュメント

ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});

ああ、ありがとう。奇妙なエラーが発生し、スニペットに_gaqが含まれていないことに気づきました。愚かなグーグル:彼らのコードを更新することなど!はは。
CWSpear 2013

3
を使用$windowしてウィンドウにアクセスしていることを確認してください(gaAngular内だけで可能性がありますundefined)。また、ga('send', 'pageview');最初にページにアクセスしたときに重複を防ぐために、元のGAコードから削除することもできます。
CWSpear 2013

6
あなたは、このようなページビューを送信UI-ルータをすることができます使用:$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
pherris

2
追加するには:アプリで検索パラメーターを使用している場合は、次を使用してそれらを追跡できます$location.url()
Ade

2
通常はクエリ文字列のパラメータを除外する必要があるため、.path()を使用する方が.url()よりも優れているため、この回答に賛成しました。参照:Google Analyticsの設定ミス#2:クエリ文字列変数
frodo2975

11

私はこれであなたたちを助けることができるサービス+フィルターを作成しました、そして将来あなたがそれらを追加することを選択した場合には多分他のいくつかのプロバイダーでも同様です。

https://github.com/mgonto/angularyticsをチェックして、これがどのように機能するかを教えてください。


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()
          });
        });
    }
  ]);

3番目のパラメーターを($ location.path()の代わりに)オブジェクトとして設定し、$ stateChangeSuccessの代わりに$ routeChangeSuccessを使用するとうまくいきました。

お役に立てれば。


7

上記のアプローチを使用して、githubで簡単な例を作成しました。

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


パスをより適切に報告するための修正を追加しました。したがって、/account/:accountId 別名パスのルートがある場合、パスは次のhttp://somesite.com/account/123ように報告されます/account?accountId=123
IBootstrap

@IBootstrapクエリ文字列にルートパラメータを配置する利点は何ですか?
Pavel Nikolov 2013

@IBootstrap同じ質問があります。ルート文字列をクエリ文字列に配置する利点は何ですか?
Dzung Nguyen 2013

1
すべてのルートが異なるページであるわけではなく、GAは各ルートを異なるページとして扱います。ルートをクエリ文字列に変換することにより、クエリ文字列の一部を無視するオプションがあります。
IBootstrap 2013

5

これを行う最良の方法は、Googleタグマネージャーを使用して、履歴リスナーに基づいてGoogleアナリティクスタグを配信することです。これらはGTMインターフェースに組み込まれており、クライアント側のHTML5インタラクションを簡単に追跡できます。

組み込みの履歴変数を有効にし、履歴の変更に基づいてイベントを発生させるトリガーを作成します。


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>

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
    }
  ]);

私はその自己
注射の

ちょうど好奇心から、なぜpage現在のパスでを設定し、それをとして送信するのpageviewですか?それを単にではなくそのように行うことの違いは何$window.ga('send', 'pageview', {page: $location.url()});ですか?
Fizzix、2016

1
私はTBHを思い出せませんが、他のアクションに柔軟性を残したり、他の場所に追加のログを記録したりすることができ、現在のページのgaを明示的に伝えることでより正確になる可能性があるため、gaは正確に機能し続けることができます。 「任意の」ページURLのページビューをログに記録するだけです。
ilovett 2016

リアルタイム分析をGoogleで機能させたい場合は、「設定」を行う必要があります。:なぜドキュメントの参照参照してくださいdevelopers.google.com/analytics/devguides/collection/...
fuzzysearch

同じページで送信されるすべてのヒット(ユーザーインタラクションを追跡するGAイベントなど)が同じページパス値で送信されるように、「設定」をお勧めします。リアルタイム分析とは何の関係もありません。developer.google.com/analytics/devguides/collection/…を
SEOを開く

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>

AngularJSコード:

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

TrackingId独自のトラッキングIDに置き換えます。


4

誰かがディレクティブを使用して実装したい場合は、index.htmlのdivを識別(または作成)します(bodyタグのすぐ下、または同じDOMレベルで)。

<div class="google-analytics"/>

ディレクティブに次のコードを追加します

myApp.directive('googleAnalytics', function ( $location, $window ) {
  return {
    scope: true,
    link: function (scope) {
      scope.$on( '$routeChangeSuccess', function () {
        $window._gaq.push(['_trackPageview', $location.path()]);
      });
    }
  };
});

3

ui-routerを使用している場合は、次のように$ stateChangeSuccessイベントをサブスクライブできます。

$rootScope.$on('$stateChangeSuccess', function (event) {
    $window.ga('send', 'pageview', $location.path());
});

完全な実用例については、このブログ投稿を参照してください


3

GAの「セット」を使用して、Googleリアルタイム分析のためにルートが確実にピックアップされるようにします。それ以外の場合、GAへの後続の呼び出しはリアルタイムパネルに表示されません。

$scope.$on('$routeChangeSuccess', function() {
    $window.ga('set', 'page', $location.url());
    $window.ga('send', 'pageview');
});

Googleでは、「送信」で3番目のパラメータを渡す代わりに、一般的にこのアプローチを強くお勧めします。 https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications


3

ngRouteの代わりにAngularUIルーターを使用している場合は、次のコードを使用してページビューを追跡できます。

app.run(function ($rootScope) {
    $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
        ga('set', 'page', toState.url);
        ga('send', 'pageview');
    });
});


3

AngluarJSをhtml5モードで使用しています。次の解決策が最も信頼できるものであることがわかりました:

angular-google-analyticsライブラリを使用します。次のように初期化します。

//Do this in module that is always initialized on your webapp    
angular.module('core').config(["AnalyticsProvider",
  function (AnalyticsProvider) {
    AnalyticsProvider.setAccount(YOUR_GOOGLE_ANALYTICS_TRACKING_CODE);

    //Ignoring first page load because of HTML5 route mode to ensure that page view is called only when you explicitly call for pageview event
    AnalyticsProvider.ignoreFirstPageLoad(true);
  }
]);

その後、$ stateChangeSuccess 'にリスナーを追加し、trackPageイベントを送信します。

angular.module('core').run(['$rootScope', '$location', 'Analytics', 
    function($rootScope, $location, Analytics) {
        $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams, options) {
            try {
                Analytics.trackPage($location.url());
            }
            catch(err) {
              //user browser is disabling tracking
            }
        });
    }
]);

いつでも、ユーザーを初期化したら、そこにアナリティクスを挿入して電話をかけることができます。

Analytics.set('&uid', user.id);

2

私はui-routerを使用しており、コードは次のようになります。

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams){
  /* Google analytics */
  var path = toState.url;
  for(var i in toParams){
    path = path.replace(':' + i, toParams[i]);
  }
  /* global ga */
  ga('send', 'pageview', path);
});

このようにして、さまざまな状態を追跡できます。多分誰かがそれを便利だと思うでしょう。


1

個人的には、現在のパスではなくテンプレートURLを使用して分析を設定したいです。これは主に、アプリケーションにmessage/:idまたはなどの多くのカスタムパスがあるためですprofile/:id。これらのパスを送信すると、アナリティクス内で非常に多くのページが表示されてしまうため、ユーザーが最も多くアクセスしているページを確認することは困難です。

$rootScope.$on('$viewContentLoaded', function(event) {
    $window.ga('send', 'pageview', {
        page: $route.current.templateUrl.replace("views", "")
    });
});

私は今のような私の分析内のきれいなページビューを取得user-profile.htmlし、message.html代わりに多くのページがあることのをprofile/1profile/2profile/3。レポートを処理して、ユーザープロファイルを表示しているユーザーの数を確認できます。

分析でこれが悪い習慣であることに異論がある場合は、私はそれについて喜んで聞いています。Google Analyticsを使用するのはかなり新しいので、これが最善のアプローチであるかどうかはあまりわかりません。


1

セグメント分析ライブラリを使用し、Angularクイックスタートガイドに従うことをお勧めします。単一のAPIでページの訪問を追跡し、ユーザーの行動アクションを追跡することができます。SPAがあるRouterOutlet場合は、ページのレンダリング時にコンポーネントが処理し、ngOnInit呼び出しを呼び出すために使用できるようにすることができpageます。以下の例は、これを行う方法の1つを示しています。

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
  ngOnInit() {
    window.analytics.page('Home');
  }
}

私はhttps://github.com/segmentio/analytics-angularのメンテナーです。セグメントを使用すると、追加のコードを記述せずに複数の分析ツール(250以上の宛先をサポート)を試すことに興味がある場合、スイッチを押すだけで異なる宛先をオン/オフに切り替えることができます。🙂


0

ペドロ・ロペスの答えとさらに融合し、

これをngGoogleAnalytisモジュールに追加しました(多くのアプリで再利用しています):

var base = $('base').attr('href').replace(/\/$/, "");

この場合、インデックスリンクにタグがあります。

  <base href="/store/">

angular.js v1.3でhtml5モードを使用するときに役立ちます

(ベースタグがスラッシュ/で終わっていない場合は、replace()関数呼び出しを削除してください)

angular.module("ngGoogleAnalytics", []).run(['$rootScope', '$location', '$window',
    function($rootScope, $location, $window) {
      $rootScope.$on('$routeChangeSuccess',
        function(event) {
          if (!$window.ga) { return; }
          var base = $('base').attr('href').replace(/\/$/, "");

          $window.ga('send', 'pageview', {
            page: base + $location.path()
          });
        }
      );
    }
  ]);

-3

Googleアナリティクスの新しいトラッキングコードを完全に制御する必要がある場合は、私の独自のAngular-GAを使用できます。

gaインジェクションを介して利用できるため、テストが簡単です。すべてのrouteChangeでパスを設定することを除いて、それは魔法を使いません。ここでもページビューを送信する必要があります。

app.run(function ($rootScope, $location, ga) {
    $rootScope.$on('$routeChangeSuccess', function(){
        ga('send', 'pageview');
    });
});

さらにga、次のように、複数の分析関数をイベントにバインドできるディレクティブがあります。

<a href="#" ga="[['set', 'metric1', 10], ['send', 'event', 'player', 'play', video.id]]"></a>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.