Могу ли я наблюдать за изменениями переменных слоя данных в Google Tag Manager?

1

Я пишу функцию 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 при его изменении.

Как я могу это сделать?

Теги:
google-tag-manager
google-datalayer

2 ответа

0
Лучший ответ

Спасибо @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.
    }

};

Спасибо!

1

Этот 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
    }

};
  • 0
    Спасибо! Я не осознавал, что вы можете рассматривать dataLayer как обычный старый массив Javascript. Более элегантный способ сделать это - просто взять последний элемент перед тем, как включить новый элемент.
  • 0
    Если это работает для вас, пожалуйста, примите мой ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню