1

我正在使用谷歌标签管理器为谷歌分析修补增强的电子商务reoprting代码 - 通过屏幕抓取数据以在流程中的结帐步骤。代码如下所示:

var els = document.querySelectorAll('div.field_cart');

Array.prototype.forEach.call(els,function(element){

dataLayer.push({
  'event': 'checkout',
  'ecommerce': {
      'checkout': {
        'actionField': {'step': 1, 'option': 'Visa'},
        'products': [{
            'id': $('div.field_cart')[0].innerText,
        'price': $('div.field_cart')[1].innerText.match(/[0-9]+/),
        'quantity': $('div.field_cart')[2].innerText
     }//,{}...//
    ]
  }
 });
})

问题是,如果有多个项目 - 第二个覆盖第一个等而不是被推送......我想知道如何将新产品附加到产品对象?

4

2 回答 2

3

因为您不能单独推送产品,所以您需要构建包含所有产品的对象。

  • 第一步是检索已经在 dataLayer 中的对象(即使是空的)
  • 获取产品对象
  • 将新项目推入内部
  • 将整个对象推送到 dataLayer

如果您在执行上述任何步骤时遇到问题,请告诉我。

尝试首先定义 dataLayer 变量:

var dataLayer = window.dataLayer || [];

它将采用现有的 dataLayer 变量并添加使用它,或者如果没有,它将为其创建数组。

另外,我可以看到您使用的是小写的“数据层”。它应该是“dataLayer”。

我希望这将有所帮助。

于 2015-08-14T13:05:36.077 回答
2

我发现谷歌标签管理器重新dataLayer.push()连接方法来触发事件并保护 dataLayer 的大小。副作用是它没有按预期运行。解决这个问题的方法是将所有抓取的产品数据推送到一个 javascript 变量中,一旦准备好,将该变量推送到dataLayer如下:

function scrape2DL() {    
    dataLayer.push({'ecommerce.checkout.actionField': {step: 2}}); //action object

    var base = 0; 
    var products=[];
    while (base < $('div.field_cart').length/4) {
       products.push([{id: $('div.field_cart')[4 * base + 0].innerText, price: $('div.field_cart')[4 * base + 1].innerText.match(/[0-9]+/), quantity: $('div.field_cart')[4 * base + 2].innerText}]);
       base += 1;
    }//while 
    dataLayer.push({'ecommerce.checkout.products': products}); // add a product 
 }
 scrape2DL();
 dataLayer.push({event: 'checkout'});      // for GTM triggers

然而事实证明,可以使用 datalayer get方法将产品从数据层获取到 javascript 变量中,然后将更多产品附加到其中。但是我最终避免了这种方法,因为它跳过了连接到dataLayer.push().

以下资源有一些帮助:

于 2015-08-17T06:40:41.420 回答