2

我正在编写一个 Javascript 函数,它将成为谷歌标签管理器中的一个标签。

它被加载到我几乎无法控制的 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 的值。我现在要检查的是 currentgtm.customWatchedVariable是否与 last 不同gtm.customWatchedVariable,然后在 GTM 更改时触发 Trigger。

我怎样才能做到这一点?

4

2 回答 2

1

此 JS 正在检查gtm.customWatchedVariabledatalayer 对象中的最后一个变量是否不同:

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
    }

};
于 2017-08-02T08:36:08.393 回答
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.
    }

};

谢谢!

于 2017-08-03T00:29:38.337 回答