Могу ли я следить за изменениями переменных уровня данных в Диспетчере тегов Google?

Я пишу функцию 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, когда он изменится.

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


person haz    schedule 02.08.2017    source источник


Ответы (2)


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

};
person Victor Leontyev    schedule 02.08.2017
comment
Спасибо! Я не понимал, что вы можете обращаться с dataLayer как с обычным старым массивом Javascript. Более элегантный способ сделать это - просто взять последний элемент перед тем, как протолкнуть новый элемент. - person haz; 03.08.2017
comment
Если это работает для вас, не могли бы вы принять мой ответ - person Victor Leontyev; 03.08.2017

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

};

Спасибо!

person haz    schedule 03.08.2017