AngularとGoogleAnalytics

pjlamb12

スクリプトをインデックスファイルに手動で追加せずに、AngularアプリにGoogleAnalyticsを追加しようとしています。私の目標は、分析を初期化し、ページビューを追跡するために呼び出すことができる関数を備えたサービスを使用することです。サービスの主要部分は次のとおりです。

export class GoogleAnalyticsService {
    private googleAnalyticsId: string;
    private renderer2: Renderer2;
    private scriptsLoaded: boolean = false;

    constructor(
        private rendererFactory2: RendererFactory2,
        @Inject(DOCUMENT) private _document: Document,
        private _config: RuntimeConfigLoaderService,
        private _router: Router,
    ) {
        this.renderer2 = this.rendererFactory2.createRenderer(null, null);
        this.googleAnalyticsId = this._config.getConfigObjectKey('googleAnalyticsId');
    }

    init() {
        this.insertMainScript();
    }

    private insertMainScript() {
        if (this.googleAnalyticsId) {
            const script: HTMLScriptElement = this.renderer2.createElement('script');
            script.type = 'text/javascript';
            script.onload = this.insertSecondHalfOfScript.bind(this);
            script.src = `https://www.googletagmanager.com/gtag/js?id=${this.googleAnalyticsId}`;
            script.text = '';
            this.renderer2.appendChild(this._document.body, script);
        }
    }

    private insertSecondHalfOfScript() {
        const script: HTMLScriptElement = this.renderer2.createElement('script');
        script.type = 'text/javascript';
        script.src = '';
        script.text = `
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());
        `;
        this.renderer2.appendChild(this._document.body, script);
        this.scriptsLoaded = true;
    }

    trackSinglePageView(event: NavigationEnd) {
        if (this.googleAnalyticsId && this.scriptsLoaded) {
            console.log('logging pageview');
            gtag('config', this.googleAnalyticsId, { page_path: event.urlAfterRedirects });
        }
    }

    trackPageViews() {
        return this._router.events.pipe(
            filter((evt: RouterEvent) => evt instanceof NavigationEnd),
            tap((event: NavigationEnd) => {
                this.trackSinglePageView(event);
            }),
        );
    }
}

から呼び出す主な関数AppComponentinitです。これにより、スクリプトがページに挿入されます。アプリケーションのロードを見ると、これらのスクリプトが追加されているのがわかります。またhttps://www.googletagmanager.com/gtag/js、開発者ツールの[ネットワーク]タブにスクリプトの読み込みが表示されます。したがって、スクリプトは間違いなくそこにあります。

次に、でinit関数を呼び出した後、関数AppComponentを呼び出しtrackPageViewsて、返されたObservableをサブスクライブします。上記のスクリプトが読み込まれるまですべてのルーターイベントを除外してから、イベントではないすべてのイベントを除外しNavigationEndます。スクリプトがロードされ、それがNavigationEndイベントである場合、trackSinglePageView関数gtagは必要なデータとともに呼び出されます。ただし、これが発生すると、次のエラーが発生します。

core.js:6189 ERROR ReferenceError: gtag is not defined
    at GoogleAnalyticsService.trackSinglePageView (google-analytics.service.ts:58)
    at TapSubscriber._tapNext (google-analytics.service.ts:69)
    at TapSubscriber._next (tap.js:40)
    at TapSubscriber.next (Subscriber.js:49)
    at FilterSubscriber._next (filter.js:33)
    at FilterSubscriber.next (Subscriber.js:49)
    at Subject.next (Subject.js:39)
    at SafeSubscriber._next (router.js:7593)
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
    at SafeSubscriber.next (Subscriber.js:122)

サービスを使用して分析スクリプトをロードしheadてアプリのindex.htmlファイルに配置し、ページビューを追跡しない場合、コンソールでエラーは発生しません。したがって、スクリプトはロードさgtagれていheadますが、分析スクリプトがに含まれていない限り、まだ定義されていないようです。

これを回避する方法はありますか?私はここで何か間違ったことをしていますか?どんなアイデアでも大歓迎です。

pjlamb12

したがって、insertSecondHalfOfScript関数で作成されたスクリプトのテキストは実行されなかったことがわかります。gtagそのページで利用できるようになっているようですそのため、そのテキスト属性にコードを追加する代わりに、コードをアセットファイルに入れて、insertMainScript関数にスクリプトをロードするようにロードしましたしたがって、開始フローは次のようになります。

init() {
    this.insertMainScript();
}

private insertMainScript() {
    if (this.googleAnalyticsId) {
        const script: HTMLScriptElement = this.renderer2.createElement('script');
        script.type = 'text/javascript';
        script.onload = this.insertSecondHalfOfScript.bind(this);
        script.src = `https://www.googletagmanager.com/gtag/js?id=${this.googleAnalyticsId}`;
        script.text = '';
        this.renderer2.appendChild(this._document.body, script);
    }
}

private insertSecondHalfOfScript() {
    const script: HTMLScriptElement = this.renderer2.createElement('script');
    script.type = 'text/javascript';
    script.src = '/assets/scripts/analytics/analytics-starting-script.js';
    script.text = '';
    this.renderer2.appendChild(this._document.body, script);
    script.onload = () => {
        this.scriptsLoaded = true;
    };
}

このように2番目のスクリプトをロードすると、ReferenceError以前に取得していたものが取得できなくなったため、機能しているようです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

GoogleAnalyticsとanonymizeIp

分類Dev

Android:GoogleAnalyticsとEasyTracker

分類Dev

Angular.jsとGoogleAnalyticsコンテンツの実験

分類Dev

iOS9GoogleAnalyticsとNSAppTransportSecurity

分類Dev

AngularjsとGoogleAnalyticsの統合

分類Dev

Angular / GoogleAnalyticsリピートリスト

分類Dev

iOS:GoogleAnalyticsとAdMobでのCocoaPodsの問題

分類Dev

AJAXフォーム送信とGoogleAnalytics

分類Dev

JwplayerエラーイベントとGoogleAnalytics

分類Dev

GoogleAnalyticsとPython-承認の壁

分類Dev

BigQueryとGoogleAnalyticsレポートの合計セッション数

分類Dev

月ごとにグループ化GoogleAnalytics / BigQuery

分類Dev

GoogleAnalyticsとGoogleAdWords gtag.jsを組み合わせる方法は?

分類Dev

GoogleAnalyticsのダイレクト/オーガニックとは

分類Dev

ProguardとGoogleAnalyticsがapkの問題をエクスポート

分類Dev

GoogleAnalyticsがMeteorと連携していない

分類Dev

WordpressとGoogleAnalyticsで個々の訪問者を追跡する

分類Dev

GoogleAnalyticsの検索と置換フィルター

分類Dev

PhonegapとGoogleAnalyticsが機能していません

分類Dev

同じウェブサイトでGoogleAnalyticsとPiwikを使用する

分類Dev

ログインが必要なGoogleAnalyticsとYii2ページ

分類Dev

パフォーマンスへの影響:GoogleAnalyticsと Adobe Analytics

分類Dev

動的で一意のURLにAngularticsとGoogleAnalyticsを使用する

分類Dev

GoogleAnalyticsトラッカーとディメンション

分類Dev

AndroidアプリにFirebaseAnalyticsとGoogleAnalyticsを追加する

分類Dev

Angular2を使用してGoogleAnalyticsでイベントを追跡する方法

分類Dev

GoogleAnalyticsとodfuscationを使用するとビルドエラーが発生します

分類Dev

GoogleAnalyticsのプロパティとアプリとウェブサイトの表示

分類Dev

GoogleAnalyticsのeコマースと拡張eコマースの違い

Related 関連記事

  1. 1

    GoogleAnalyticsとanonymizeIp

  2. 2

    Android:GoogleAnalyticsとEasyTracker

  3. 3

    Angular.jsとGoogleAnalyticsコンテンツの実験

  4. 4

    iOS9GoogleAnalyticsとNSAppTransportSecurity

  5. 5

    AngularjsとGoogleAnalyticsの統合

  6. 6

    Angular / GoogleAnalyticsリピートリスト

  7. 7

    iOS:GoogleAnalyticsとAdMobでのCocoaPodsの問題

  8. 8

    AJAXフォーム送信とGoogleAnalytics

  9. 9

    JwplayerエラーイベントとGoogleAnalytics

  10. 10

    GoogleAnalyticsとPython-承認の壁

  11. 11

    BigQueryとGoogleAnalyticsレポートの合計セッション数

  12. 12

    月ごとにグループ化GoogleAnalytics / BigQuery

  13. 13

    GoogleAnalyticsとGoogleAdWords gtag.jsを組み合わせる方法は?

  14. 14

    GoogleAnalyticsのダイレクト/オーガニックとは

  15. 15

    ProguardとGoogleAnalyticsがapkの問題をエクスポート

  16. 16

    GoogleAnalyticsがMeteorと連携していない

  17. 17

    WordpressとGoogleAnalyticsで個々の訪問者を追跡する

  18. 18

    GoogleAnalyticsの検索と置換フィルター

  19. 19

    PhonegapとGoogleAnalyticsが機能していません

  20. 20

    同じウェブサイトでGoogleAnalyticsとPiwikを使用する

  21. 21

    ログインが必要なGoogleAnalyticsとYii2ページ

  22. 22

    パフォーマンスへの影響:GoogleAnalyticsと Adobe Analytics

  23. 23

    動的で一意のURLにAngularticsとGoogleAnalyticsを使用する

  24. 24

    GoogleAnalyticsトラッカーとディメンション

  25. 25

    AndroidアプリにFirebaseAnalyticsとGoogleAnalyticsを追加する

  26. 26

    Angular2を使用してGoogleAnalyticsでイベントを追跡する方法

  27. 27

    GoogleAnalyticsとodfuscationを使用するとビルドエラーが発生します

  28. 28

    GoogleAnalyticsのプロパティとアプリとウェブサイトの表示

  29. 29

    GoogleAnalyticsのeコマースと拡張eコマースの違い

ホットタグ

アーカイブ