javascript 在Angular2中跟踪谷歌分析页面浏览量

8xiog9wr  于 2023-02-07  发布在  Java
关注(0)|答案(6)|浏览(178)

我用Angular 2作为前端建立了一个新网站,因为所有的事情都是通过推送状态完成的,所以没有页面加载,而页面加载通常会触发Google Analytics代码向Google服务器发送页面视图。
如何手动向Google发送页面查看事件,以便跟踪我的站点的哪些用户正在查看?

doinxwow

doinxwow1#

我设法通过订阅路由器上的更改,检查路线是否确实发生了变化(我有时会在一些路线上得到多个事件),然后将新路径发送到谷歌来实现这一点。

    • 应用程序组件. ts**
import { ... } from '...';

// Declare ga function as ambient
declare var ga:Function;

@Component({ ... })

export class AppComponent {
    private currentRoute:string;

    constructor(_router:Router) {
        // Using Rx's built in `distinctUntilChanged ` feature to handle url change c/o @dloomb's answer
        router.events.pipe(distinctUntilChanged((previous: any, current: any) => {
            // Subscribe to any `NavigationEnd` events where the url has changed
            if(current instanceof NavigationEnd) {
                return previous.url === current.url;
            }
            return true;
        })).subscribe((x: any) => {
            ga('set', 'page', x.url);
            ga('send', 'pageview')
        });
      }
    }
}

在加载angular2应用程序之前,您还需要在主索引文件中包含google分析代码,以便全局ga对象存在,但您不希望两次发送初始视图。

    • 索引. html**
<script>
  (function(i,s,o,g,r,a,m){...})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-X', 'auto');
  // Remove this line to avoid sending the first page view twice.
  //ga('send', 'pageview');

</script>
<!-- 
    Load your ng2 app after ga. 
    This style of deferred script loading doesn't guarantee this will happen
    but you can use Promise's or what works for your particular project. 
-->
<script defer type="text/javascript" src="/app.js"></script>
    • 使用第三方库**

作为您自己实现GA的替代方案,Angulartics2库也是一个用于实现GA跟踪的流行工具,并且还与其他分析供应商集成。

hgc7kmma

hgc7kmma2#

扩大伊恩的答案。你可以使用Rx的内置功能来处理当前和新路线之间的区别。

import { NavigationEnd, Router } from '@angular/router';

declare var ga: any;

export class AppComponent {
        constructor(public router: Router) {
            router.events.distinctUntilChanged((previous: any, current: any) => {
                if(current instanceof NavigationEnd) {
                    return previous.url === current.url;
                }
                return true;
            }).subscribe((x: any) => {
                console.log('router.change', x);
                ga('send', 'pageview', x.url);
            });
        }
    }

我们使用distinctUntilChanged操作符使观察者只发出NavigationEnd类型的项,并且这些项与之前发出的项没有相同的路由。

flvlnr44

flvlnr443#

如果您在2017年8月之后遇到这个问题,那么您最有可能应该使用gtag.js(Google Universal Analytics全球网站标签)而不是旧的analytics.js。我建议您在继续之前检查Migrate from analytics.js to gtag.js页面中两者之间的差异,以及How gtag.js works in Single page applications
当你从Google Analytics获取代码片段时,它看起来像这样:

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=<%= GOOGLE_ANALYTICS_ID %>"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', '<%= GOOGLE_ANALYTICS_ID %>'); <!-- Remove that one -->
</script>

您需要删除脚本的最后一行,并将其余部分添加到index.html中。
然后,您必须将从上面的脚本中删除的行添加到代码 * 中,并将页面添加到track* 中。基本上,这与上面的家伙为analytics.js建议的几乎相同,但现在您使用gtag.js函数。
例如,如果你想跟踪你打开的所有页面,这里是示例代码:

import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import 'rxjs/add/operator/distinctUntilChanged';

// This still has to be declared
declare var gtag: Function;

@Component({
    moduleId: module.id,
    selector: 'my-app',
    templateUrl: 'app.component.html',
    styleUrls: ['app.component.css'],
})
export class AppComponent implements OnInit {

    constructor(private router: Router) { }

    ngOnInit() {
        this.router.events.distinctUntilChanged((previous: any, current: any) => {
            // Subscribe to any `NavigationEnd` events where the url has changed
            if(current instanceof NavigationEnd) {
                return previous.url === current.url;
            }
            return true;
        }).subscribe((x: any) => {
            gtag('config', '<%= GOOGLE_ANALYTICS_ID %>', {'page_path': x.url});
        });
    }
}

如果您已经阅读了gtag.js的文档,那么您就会知道可能有大量的跟踪选项,但是我在这里只关注最基本的用法。

oymdgrw7

oymdgrw74#

在Angular 6中,我建议app.component.ts:

import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router'
import { Title } from '@angular/platform-browser';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {

  constructor(
    private router: Router,
    private titleService: Title
  ){ }

  ngOnInit() {
     this.router.events.subscribe(event => {
      if (event instanceof NavigationEnd) {
        (<any>window).gtag('config', '<%= GOOGLE_ANALYTICS_ID %>', {
          'page_title' : this.titleService.getTitle(),
          'page_path': event.urlAfterRedirects
        });
      }
    });
  }

}

对于index.html:

<!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=<%= GOOGLE_ANALYTICS_ID %>"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag() { dataLayer.push(arguments); }
    gtag('js', new Date());
  </script>

您可以使用Angular提供的标题服务来管理页面的标题:https://angular.io/guide/set-document-title

jxct1oxe

jxct1oxe5#

假设每条角路线在app.routing.ts中都有自己的标题:

{
    path: 'shop',
    component: ShopComponent,
    data: {
      title: ' == This is Shop Component Title =='
    },
    canActivate: [AuthGuard]
  },

前面提到的解决方案仍然会在Google Analytics Report上为每条路线显示相同的页面标题。为了使用相应的Angular 路线标题(而不是一直使用index.html <title>标签内容),请在app.component.ts中使用以下代码

this.router.events.subscribe(event => {

  if (event instanceof NavigationEnd) {
    (<any>window).ga('set', 'page', event.urlAfterRedirects);

    // ----------
    //use the following 3 lines of code to use
    //correnct titles for routes        
    // ----------

    let currentRoute = this.route.root;
    let title = this.getPageTitle(currentRoute);
    (<any>window).ga('set', 'title', title);

    (<any>window).ga('send', 'pageview');

  }
});

...其中getPageTitle方法如下:

getPageTitle = function (currentRoute: ActivatedRoute) {
  let data;
    do {
      const childrenRoutes = currentRoute.children;
      currentRoute = null;
      childrenRoutes.forEach(route => {

      if (route.outlet === 'primary') {
        currentRoute = route;
        data = route.snapshot.data;
      }
    });
  } while (currentRoute);
  return data.title;
};

注意:此解决方案适用于Angular 5及以下。在Angular 6中,也可以使用TitleService

nhn9ugyo

nhn9ugyo6#

this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        ga('set','page', event.urlAfterRedirects);
        ga('send', 'pageview');
    }
});

相关问题