Я пишу функцию Javascript, которая будет тегом в Диспетчере тегов Google.
Он загружается в SPA, у меня есть минимальный контроль.
Всякий раз, когда пользователь нажимает, я использую функциональность GTM для подталкивания некоторых данных к datalayer, например:
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()
});
};
Каждый раз, когда это срабатывает, он будет выталкивать новое событие в datalayer и обновлять значение gtm.customWatchedVariable. Теперь я хочу проверить, является ли текущий gtm.customWatchedVariable
отличным от последнего gtm.customWatchedVariable
, а затем gtm.customWatchedVariable
триггер в GTM при его изменении.
Как я могу это сделать?
Спасибо @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.
}
};
Спасибо!
Этот JS проверяет, не gtm.customWatchedVariable
ли последние переменные gtm.customWatchedVariable в объекте datalayer:
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
}
};