我正试图捕捉" 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;
}
}
答案 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
并省略循环(因为这将返回单个结果)。