Google跟踪代码管理器:在特定文本后获取值作为变量

时间:2016-11-30 20:07:52

标签: javascript google-tag-manager

我正试图捕捉" sku"的价值。作为GTM中的变量。此值将在每个产品页面上更改。

页面上的代码如下所示:

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Product",
  "sku": "305FS-UJNA5",
  "offers": [{
        "@type": "Offer",
        "price": "99.00",
        "availability": "InStock",
        "priceCurrency": "USD"
        }]
}
</script>

预计要捕获的变量:305FS-UJNA5(不带双引号)。

有没有办法通过使用自定义的javascript变量类型来完成此操作,该类型将在页面上搜索"sku": "并将值返回到下一个双引号?

或者,最好的方法是什么?

我已尝试过搜索但在GTM中返回undefined ...

function () {
var content = document.body.innerText;
var query=""sku": "";
if (content.search(query) > -1 ) {
    return true;
} else {
    return false;
    }
}

1 个答案:

答案 0 :(得分:1)

如果你准备接受一个hackish解决方案

      <html>
        <head>
            <title></title>
                <script type="application/ld+json">
        {
          "@context": "http://schema.org",
          "@type": "Product",
          "sku": "305FS-UJNA5",
          "offers": [{
                "@type": "Offer",
                "price": "99.00",
                "availability": "InStock",
                "priceCurrency": "USD"
                }]
        }
        </script>
        </head>
        <body>
            <script>    
            json = {};
                scripts = document.getElementsByTagName('script');
                for (i = 0; i < scripts.length; ++i) {
                  script = scripts[i];
                  if(script.getAttribute('type') != "application/ld+json") {
                      continue;
                  }
                  json = JSON.parse(script.childNodes[0].nodeValue);
                  datalayer.push({ // dl must be initialized before
                    'event':'skuCapture',
                     'sku': json.sku
                  });
                }


            </script>
        </body>
        </html>

这会将script-Tag的内容加载到名为“json”的变量中,您可以将其加载到全局js变量中或将各个属性推送到数据层(即示例中json.sku将保存sku)。如果您不在现有事件(例如Dom Ready)上执行此操作,则需要推送自定义事件以使GTM知道该值。

如果您无法更改页面代码,显然您可以将脚本放在自定义HTML标记中(只要在脚本标记呈现后运行)。这只是一个工作的例子。

这对我在Chrome中有用,它没有经过其他浏览器测试或测试过副作用,所以你可能需要扩展这个想法,但它是可行的(即使它看起来很难看)。

实际上这可以写得更简洁:

var scripts = document.querySelectorAll("[type='application/ld+json']");
    for (i = 0; i < scripts.length; ++i) {
      script = scripts[i];
      json = JSON.parse(script.childNodes[0].nodeValue);
      console.log(json.sku);
    }  

仅选择具有正确type属性的脚本标记。如果您确定只有一个脚本标记,则可以使用document.querySelector而不是document.querySelectorAll并省略循环(因为这将返回单个结果)。