reactjs - TypeError : window. gtag 不是函数

标签 reactjs typescript next.js google-tag-manager

我完全对 GTM 感到困惑,我将它实现到我的网站以触发一些事件来处理流量,等等...就像 2 天我看到以下错误:

Error from the trackerPageView =>  TypeError: window.gtag is not a function
    at _app.js:1
    at _app.js:1
    at commons.c57c1be722ad069a7405.js:1
    at Array.map (<anonymous>)
    at Object.emit (commons.c57c1be722ad069a7405.js:1)
    at commons.c57c1be722ad069a7405.js:1
我没有看到任何关于这个问题的文档,所以我发了一个帖子来集中关于这个问题的信息。
我的配置是一个 webApp(nextjs、Reactjs、typeScript、redux),希望这会有所帮助。
_document.tsx :
import Document, { Head, Main, NextScript } from "next/document";
import { GA_TRACKING_ID } from "../lib/gtag";
import { Fragment } from "react";

export default class MyDocument extends Document {
  setGoogleTags() {
    return {
      __html: `
            (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','${GA_TRACKING_ID}');
          `,
    };
  }

  render() {
    return (
      <html lang="fr">
        <Head>
          <Fragment>
            <script dangerouslySetInnerHTML={this.setGoogleTags()} />
          </Fragment>
          <meta charSet="utf-8" />
          <meta name="viewport" content="width=device-width, initial-scale=1" />
          <meta name="theme-color" content="#000000" />
          <link
            rel="shortcut icon"
            href="***"
            crossOrigin="anonymous"
          />
          <link
            rel="stylesheet"
            href="***.css"
            crossOrigin="anonymous"
          />
        </Head>
        <body>
          <noscript>
            <iframe
              src={`https://www.googletagmanager.com/ns.html?id=${GA_TRACKING_ID}`}
              height="0"
              width="0"
              style={{ display: "none", visibility: "hidden" }}
            ></iframe>
          </noscript>
          <Main />
          <NextScript />
          <script
            type="text/javascript"
            id="hs-script-loader"
            async
            defer
            src="//js.hs-scripts.com/*****.js"
          ></script>
        </body>
      </html>
    );
  }
}
gtg/index.ts:
export const GA_TRACKING_ID = 'GTM-XXXX'

export default function trackPageView(url) {
    try {
      if (window.gtag)
        window.gtag("config", GA_TRACKING_ID, {
        page_location: url,
      });
  } catch (error) {
    console.log("Error from the trackerPageView => ", error);
  }
}

Solution I found temporary!


所以目前我的 gtag 实现让我可以让 GTM 检测到触发和触发器,我只是设置了一个新的触发器

History modification


现在它会在每次历史修改时触发分配有此触发器的事件。我对 gtag 不太满意,但这对我来说已经足够了(目前),由于我所做的实现,我仍然很恼火。我想找到正确的实现来清理我的。
问题显然来自 SSR,因为窗口变量变得未定义(在 nodeJs 中不存在)出现上面的错误。仍在寻找解决方案来解决它...
https://github.com/vercel/next.js/discussions/14980
谢谢大家,祝你有美好的一天:)

最佳答案

在使用 window 之前,您需要检查窗口是否存在。
例如:

if (typeof window !== 'undefined') {
  window.gtag("config", GA_TRACKING_ID, {
    page_location: url,
  });
}
此外,您不需要将您的 Google 标签管理器脚本包装在 <Fragment>
最后,看起来 gtag 默认不是全局可用的。您必须根据此文档自行设置:https://developers.google.com/analytics/devguides/collection/gtagjs

关于reactjs - TypeError : window. gtag 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62791299/

相关文章:

javascript - 混淆了箭头函数javascript

node.js - 部署到heroku [错误: spawn babel-node ENOENT]

javascript - 找不到模块 : Can't resolve 'child_process' NextJS + Nightmare

reactjs - NextJS/Typescript/Apollo 错误;属性在类型上不存在

reactjs - 在 typescript 的 react-native 中使用 createRef?

javascript - 使用 React js 调用两个以上的 Web 服务并将它们填充到 Material ui 下拉列表中

reactjs - React Native Audio 将语音注释发送到后端

javascript - React-contextmenu 收到右键单击的错误触发器

reactjs - 如何使用 this.refs 作为子组件列表

javascript - 将 Javascript 库 (jsencrypt) 导入 Angular 2 应用程序