Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google标记管理器自定义模板沙盒Javascript问题_Javascript_Google Tag Manager - Fatal编程技术网

Google标记管理器自定义模板沙盒Javascript问题

Google标记管理器自定义模板沙盒Javascript问题,javascript,google-tag-manager,Javascript,Google Tag Manager,我已经使用google tag manager创建了一个自定义模板,但是我在让沙盒javascript正常工作时遇到了一些困难,我知道脚本是正确注入的,原因如下 日志('Cotaylitcs:脚本加载成功') 输出到控制台。我只是不能调用我的函数。我还包括了JS代码 自定义模板代码(沙盒Javascript) 沙盒Js注入的我的Javascript代码: let Cotalytics = function(){ this.init(); }; // Init Cotalytics.p

我已经使用google tag manager创建了一个自定义模板,但是我在让沙盒javascript正常工作时遇到了一些困难,我知道脚本是正确注入的,原因如下

日志('Cotaylitcs:脚本加载成功')

输出到控制台。我只是不能调用我的函数。我还包括了JS代码

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

沙盒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();




好吧,看起来你大部分时间都在那里,但有一些事情不太对劲

  • 在addEvent调用中使用
    {key:value}
    。虽然该值将填充常量,但键不会被替换。我在想象这些将是动态变量,那么为什么你没有这样的东西:
  • 这将创建具有所需关键点的对象,而不仅仅是“关键点”

  • 这条线不行。不能在自定义模板中使用容器变量
    callInWindow('cotalytics.addEvent','testing12',{key:value},“{DL-cottageCode}”)

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

    const copyFromDataLayer = require('copyFromDataLayer');
    const cottageCode = copyFromDataLayer('cottageCode');
    
  • 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');
    

    希望这会有所帮助,如果你还有其他问题,请提问

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

    谢谢James,它工作了一段时间,但现在我仍在启动的标记上运行。我猜这是作为标记,而不是在模板生成器中?仍然运行通常意味着onSuccess/Failure事件还没有触发,因此标签可能挂在某个地方。当标记触发时,检查network选项卡,查看正在进行的调用,并将一些控制台日志放回,查看代码到达的位置。或者,如果你共享站点链接和容器预览,我很乐意看一看。xhr.open('POST','',true)//xhr.open('POST','',true);这可能会导致问题,并且肯定会阻止我进行测试,但是我看不到事件触发。你能在控制台中为你调用的所有变量设置一个成功日志吗?沙盒JS-
    //如果脚本加载成功,记录一条消息并发出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();}
    
    const copyFromDataLayer = require('copyFromDataLayer');
    const cottageCode = copyFromDataLayer('cottageCode');
    
    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');