我可以在 Google 跟踪代码管理器中查看数据层变量的变化吗?
Can I watch for changes to datalayer variables in Google Tag Manager?
我正在编写一个 Javascript 函数,它将成为 Google 标签管理器中的一个标签。
它加载在我几乎无法控制的 SPA 上。
每当用户点击时,我都会使用 GTM 功能将一些数据推送到数据层,例如:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
// Trigger a generic "gtm.click" event on every click
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
};
每触发一次,都会向数据层推送一个新的事件,并更新gtm.customWatchedVariable的值。我现在要检查的是当前 gtm.customWatchedVariable
是否与上一个 gtm.customWatchedVariable
不同,然后在 GTM 发生变化时触发触发器。
我该怎么做?
此 JS 正在检查数据层对象中的最后 gtm.customWatchedVariable
个变量是否不同:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
var customWatcherVar = dataLayer.filter(function(e){ return typeof(e["gtm.customWatchedVariable"]) != 'undefined';});
var prevDatalayer = customWatcherVar[customWatcherVar.length-2];
var newDatalayer = customWatcherVar[customWatcherVar.length-1];
var prevVal = null;
var newVal = null;
if (prevDatalayer!=null)
{
prevVal = prevDatalayer["gtm.customWatchedVariable"];
}
if (newDatalayer!=null)
{
newVal = newDatalayer["gtm.customWatchedVariable"];
}
if (prevVal != newVal)
{
// Push another datalayer, because gtm.customWatchedVariable changed
}
};
感谢@victor-leontyev,指出我的答案。
我没有意识到您可以像对待任何其他数组一样对待 dataLayer 对象。所以我的代码现在看起来像这样:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
var lastEvent = dataLayer
.filter(function (e) { return e.event === 'gtm.customEvent'; })
.pop();
var lastValue = lastEvent instanceof Object
? lastEvent["gtm.customWatchedVariable"]
: false;
// Trigger a generic "gtm.click" event on every click
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
if (lastValue !== target.val()) {
// Do the thing.
}
};
谢谢!
我正在编写一个 Javascript 函数,它将成为 Google 标签管理器中的一个标签。
它加载在我几乎无法控制的 SPA 上。
每当用户点击时,我都会使用 GTM 功能将一些数据推送到数据层,例如:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
// Trigger a generic "gtm.click" event on every click
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
};
每触发一次,都会向数据层推送一个新的事件,并更新gtm.customWatchedVariable的值。我现在要检查的是当前 gtm.customWatchedVariable
是否与上一个 gtm.customWatchedVariable
不同,然后在 GTM 发生变化时触发触发器。
我该怎么做?
此 JS 正在检查数据层对象中的最后 gtm.customWatchedVariable
个变量是否不同:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
var customWatcherVar = dataLayer.filter(function(e){ return typeof(e["gtm.customWatchedVariable"]) != 'undefined';});
var prevDatalayer = customWatcherVar[customWatcherVar.length-2];
var newDatalayer = customWatcherVar[customWatcherVar.length-1];
var prevVal = null;
var newVal = null;
if (prevDatalayer!=null)
{
prevVal = prevDatalayer["gtm.customWatchedVariable"];
}
if (newDatalayer!=null)
{
newVal = newDatalayer["gtm.customWatchedVariable"];
}
if (prevVal != newVal)
{
// Push another datalayer, because gtm.customWatchedVariable changed
}
};
感谢@victor-leontyev,指出我的答案。
我没有意识到您可以像对待任何其他数组一样对待 dataLayer 对象。所以我的代码现在看起来像这样:
var someEventIsTriggered = function(e) {
var target = $('input#watched');
var lastEvent = dataLayer
.filter(function (e) { return e.event === 'gtm.customEvent'; })
.pop();
var lastValue = lastEvent instanceof Object
? lastEvent["gtm.customWatchedVariable"]
: false;
// Trigger a generic "gtm.click" event on every click
dataLayer.push({
"event": "gtm.customEvent",
"gtm.customWatchedVariable": target.val()
});
if (lastValue !== target.val()) {
// Do the thing.
}
};
谢谢!