【问题标题】:Google Tag Manager Custom Template Sandboxed Javascript Problem谷歌标签管理器自定义模板沙盒 Javascript 问题
【发布时间】:2020-01-09 19:20:23
【问题描述】:

我已经使用谷歌标签管理器创建了一个自定义模板,但是我在让我的沙盒 javascript 工作时遇到了一些困难,我知道脚本是正确注入的,因为以下

log('Cotaylits: 脚本加载成功。');

输出到控制台。我只是无法调用我的函数。我也包含了 JS 代码。

自定义模板代码(沙盒 Javascript)

// Enter your template code here.
const log = require('logToConsole');
const injectScript = require('injectScript');
const copyFromWindow = require('copyFromWindow');
const callInWindow = require('callInWindow');
const callLater = require('callLater');
const setInWindow = require('setInWindow');

const key = "testing";
const value = "test2";
const url = 'https://api.deve/cotalytics/cotalytics.js';


// If the script loaded successfully, log a message and signal success
const onSuccess = () => {
  log('Cotaylitcs: Script loaded successfully.');


  const cotalytics = copyFromWindow('cotalytics');
  log(cotalytics);
  callInWindow('cotalytics.addEvent',"testing12" ,{key: value}, "{{DL - cottageCode}}");
  callInWindow('cotalytics.logEvents()');
  data.gtmOnSuccess();
};

// If the script fails to load, log a message and signal failure
const onFailure = () => {
  log('Cotaylitcs: Script load failed.');
  data.gtmOnFailure();
};

injectScript(url, onSuccess, onFailure, 'cotalytics');


我由 Sandboxed Js 注入的 Javascript 代码:


let Cotalytics = function(){
    this.init();
};

// Init
Cotalytics.prototype = 
{
    init: function () {

        var cotalytics = this;

        // Argument Assignment                                                                              
        //cotalytics.endpoint           =  'https://localhost:44301/api/events/',
        //cotalytics.async              =  true,
        //cotalytics.debug              = true,
        //cotalytics.events             = {}

        //creat cookie here

        return cotalytics;
    },
      // Add Interaction Object Triggered By Events to Records Array
    addEvent: function (eventType, data, cottageCode, brandid) {
        data = data || {};
        cottageCode = cottageCode || null;

        data.Browser = window.navigator.appVersion;

        var cotalytics  = this;

            // cotalytics Object
            cotalytics.events     = {
                timestamp       : new Date(),
                cottagecode     : cottageCode,
                type            : eventType,
                ipaddress       : "127.0.0.1",
                requesturl      : window.location.href,
                sessionid       : "1234567",
                brandid         : brandid,
                eventData  : Object.keys(data).map(function(key) { return {"key": key, "value": data[key]}})
            };


        // Log Interaction if Debugging

            //cotalytics.logEvents();
            //console.log("Session:\n", interactor.interaction);
            //var data =JSON.stringify(interactor)
           console.log("JSON:\n", JSON.stringify(cotalytics));


        return cotalytics;
    },
     // Gather Additional Data and Send Interaction(s) to Server
     logEvents: function () {

        var cotalytics  = this,
            // Initialize Cross Header Request
            xhr         = new XMLHttpRequest();

        // Post Session Data Serialized as JSON
        xhr.open('POST', 'https://localhost:44301/api/events/', true);

        xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        var data = JSON.stringify(cotalytics.events);
        xhr.send(data);

        return cotalytics;
        }
};


window.cotalytics = new Cotalytics();



【问题讨论】:

    标签: javascript google-tag-manager


    【解决方案1】:

    好的,看起来您大部分时间都在那儿,但有些地方不太对劲。

    1. 在addEvent 调用中使用{key: value}。虽然值将用您的常量填充,但键不会。我想象这些将是动态变量,所以你为什么没有类似的东西:
    const kvp= {};
    const key = "yourKey";
    const value = "yourValue";
    kvp[key] = value;
    

    这将使用您想要的键创建对象,而不仅仅是“键”。

    1. 这里这条线行不通。您不能在自定义模板中使用容器变量。

    callInWindow('cotalytics.addEvent',"testing12" ,{key: value}, "{{DL - cottageCode}}");

    它看起来像一个 dataLayer 变量,那么为什么不使用 copyFromDataLayer API 并尝试一下呢?

    const copyFromDataLayer = require('copyFromDataLayer');
    const cottageCode = copyFromDataLayer('cottageCode');
    
    1. logEvents callInWindow callInWindow('cotalytics.logEvents()'); 不需要括号,只需 callInWindow('cotalytics.logEvents');

    我得到的最终代码是:

    const log = require('logToConsole');
    const injectScript = require('injectScript');
    const callInWindow = require('callInWindow');
    const makeTableMap = require('makeTableMap');
    const copyFromDataLayer = require('copyFromDataLayer');
    
    const cottageCode = copyFromDataLayer('cottageCode');
    
    //Create the Key Value Pair
    const kvp = {};
    const key = "testing";
    const value = "test2";
    kvp[key]=value;
    
    const url = "https://api.deve/cotalytics/cotalytics.js";
    
    // If the script loaded successfully, log a message and signal success
    const onSuccess = () => {
      log('Cotaylitcs: Script loaded successfully.');
      callInWindow('cotalytics.addEvent',"testing12" ,kvp,cottageCode);
      callInWindow('cotalytics.logEvents');
      data.gtmOnSuccess();
    };
    
    // If the script fails to load, log a message and signal failure
    const onFailure = () => {
      log('Cotaylitcs: Script load failed.');
      data.gtmOnFailure();
    };
    
    injectScript(url, onSuccess, onFailure, 'cotalytics');
    

    希望对您有所帮助,如果您还有其他问题,请询问!

    【讨论】:

    • 谢谢詹姆斯,它工作了一点,但现在我在被触发的标签上得到了仍在运行状态
    • 我猜这是作为标签而不是在模板生成器中? Still Running 通常意味着 onSuccess/Failure 事件尚未触发,因此标签可能挂在某处。当标签触发时检查网络选项卡并查看正在进行的调用,并将一些控制台日志放回以查看代码到达的位置。或者,如果您共享站点链接和容器预览,我很乐意查看。
    • 当我查看该站点时,您正在加载的 js 文件有这些行。 xhr.open('POST', 'localhost:44301/api/events', true); //xhr.open('POST', 'cotalytics-test.azurewebsites.net/api/events', true);这可能会导致问题,并且肯定会阻止我进行测试,但是我看不到事件触发。您可以在控制台中为您调用的所有变量输入成功吗?
    • 沙盒化 JS - // If the script loaded successfully, log a message and signal success const onSuccess = () => { log('Cotaylitcs: Script loaded successfully.'); log('Cotaylitcs: KVP'); log(kvp); log('Cotaylitcs: cottagecode'); log(cottageCode); log('Cotaylitcs: apikey'); log(apikey); callInWindow('cotalytics.addEvent',"testing12" ,kvp, cottageCode); log('Cotaylitcs: Passed ad event '); callInWindow('cotalytics.logEvents', apikey); log('Cotaylitcs: Passed log event '); data.gtmOnSuccess(); };
    【解决方案2】:

    我现在已经设法解决了这个问题。我仍在使用自定义模板,但我需要添加一个新的自定义 HTML 标记,将我的 .JS 脚本注入到所有页面中,之后我的自定义模板标记有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多