GTM脚本后dataLayer.push无法正常工作

时间:2018-08-01 05:37:56

标签: javascript google-analytics google-tag-manager

我想使用Google跟踪代码管理器实施增强型电子商务,并希望为Universal Analytics推送一些数据。

我总是在GTM脚本之前创建dataLayer,但是现在我需要使用dataLayer.push

发送其他数据

这是行不通的,只有在GTM脚本启动之前,我才能执行datalaLayer.push。

示例。这有效:

   <script>
    <head>
     dataLayer = [{   

            'google_tag_params': {
               'ecomm_pagetype': 'category',
               'ecomm_category': '{{ $resource->seo->h1 }}',
             }
         }];

    dataLayer.push({
              'ecommerce': {
                'currencyCode': 'EUR',    
                'impressions': [
                     {
                        'id':       '12312',
                        'price':    24,
                        'category': 'wfwefwerwerwer',
                        'position': 2,
                        'name':     'wfwefwerwerwer',  
                        'brand':   'My Brand',
                        'list':    'Product List',

                    }
                ]
              }
            });

    (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','GTM-XXXXXX');

    </script>
    </head>

但是,如果我在GTM脚本不起作用后使用dataLayer.push,则不会发送任何数据,也不会报告任何错误。

这对我不起作用:

<head>
    <script>
         dataLayer = [{   

                'google_tag_params': {
                   'ecomm_pagetype': 'category',
                   'ecomm_category': '{{ $resource->seo->h1 }}',
                 }
             }];


        (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','GTM-XXXXXX');

    </script>
</head>

<body>

    //something content html here

    <footer></footer>

    <script>
        dataLayer.push({
          'ecommerce': {
            'currencyCode': 'EUR',    
            'impressions': [
                 {
                    'id':       '12312',
                    'price':    24,
                    'category': 'wfwefwerwerwer',
                    'position': 2,
                    'name':     'wfwefwerwerwer',  
                    'brand':   'My Brand',
                    'list':    'Product List',

                }
            ]
          }
        });
    </script>
</body>

1 个答案:

答案 0 :(得分:6)

您没有遵循最佳做法,因此迟早会遇到问题

  • 始终使用.push代替初始化:您的第一个调用是数组初始化(dataLayer = [)。这意味着如果dataLayer已经存在,它将被完全覆盖,包括由GTM定制的.push方法,以便接收推送的事件。现在,它可以正常工作,因为初始化后您正在调用GTM。但这是一个坏习惯。有一天,您将GTM移到该初始化上方,或者在GTM之后添加类似的初始化调用,否则它将中断。

您的第一个电话应该是:

dataLayer = window.dataLayer || [];  
dataLayer.push({...});
  • 始终设置event属性event属性是GTM用来定义触发器并知道何时可用数据的属性。您可以连续进行2次.push调用,第1次使用event,第2次不使用,来自第1次的数据将在第2个事件中可用(只要该事件不会被覆盖) ),但这又是个坏习惯,玩火了。

例如:

dataLayer.push({
  'event: 'ecommerce', // naming is up to you, should match your GTM triggers 
  'ecommerce': {
  ...

在您的特定情况下,由于缺少event键,因此只要在GTM加载后加载GTM,它就可以工作,因为启动GTM时数据已经存在。 GTM之后移动了push调用,因为没有event属性,所以GTM无法知道什么时候有数据可用。所以你应该:

  • 添加event键(总是!)
  • 配置与event匹配的触发器

有关这些主题的更多阅读内容: