Javascript Adobe DTM-使用GTM数据层

Javascript Adobe DTM-使用GTM数据层,javascript,google-tag-manager,adobe-analytics,web-analytics,data-layers,Javascript,Google Tag Manager,Adobe Analytics,Web Analytics,Data Layers,更新:YannisG关于此主题的有趣文章: 有一个安装了谷歌标签管理器和数据层的网站。我想尝试另一个使用相同数据层的标签管理解决方案(AdobeDTM),因此不需要更多的开发 数据层是一个对象列表。其中一个对象包含“pageview”属性,我想在所有页面视图中将其发送给Adobe Analytics Object { event: "virtual PV", pageview: "/page1", __proto__: Object} 假设我想从数据层的一个对象获取pageview属性,并将其

更新:YannisG关于此主题的有趣文章:

有一个安装了谷歌标签管理器和数据层的网站。我想尝试另一个使用相同数据层的标签管理解决方案(AdobeDTM),因此不需要更多的开发

数据层是一个对象列表。其中一个对象包含“pageview”属性,我想在所有页面视图中将其发送给Adobe Analytics

Object {
event: "virtual PV",
pageview: "/page1",
__proto__: Object}
假设我想从数据层的一个对象获取pageview属性,并将其放入Adobe Analytics“prop1”变量中

我在Adobe DTM中所做的:

  • 将自定义数据元素“dataLayer-pageview-page1”设置为自定义脚本(脚本返回字符串“/page1”),该字符串应作为“prop1”添加到Adobe Analytics:

    var result = dataLayer.filter(function( obj ) { return obj.event == 'virtual PV'; }); return result[0].pageview 原因可能是什么?当我在控制台中键入数据元素代码时,它正确地获取了pageview值。当DTM想要从中提取数据时,可能GTM的dataLayer对象还没有准备好,所以我应该延迟DTM-但是如何使用data Layer Helper 为此目的而设计的奇妙图书馆:

    它的工作原理与GTM数据层非常相似,但您可以自行设计

    它是完全异步的

    如何使用它? 实现此库:

    (function(){/*
     jQuery v1.9.1 (c) 2005, 2012
     jQuery Foundation, Inc. jquery.org/license.
    */
    var g=/\[object (Boolean|Number|String|Function|Array|Date|RegExp)\]/;function h(a){return null==a?String(a):(a=g.exec(Object.prototype.toString.call(Object(a))))?a[1].toLowerCase():"object"}function k(a,b){return Object.prototype.hasOwnProperty.call(Object(a),b)}function m(a){if(!a||"object"!=h(a)||a.nodeType||a==a.window)return!1;try{if(a.constructor&&!k(a,"constructor")&&!k(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}for(var c in a);return void 0===c||k(a,c)};/*
     Copyright 2012 Google Inc. All rights reserved. */
    function n(a,b,c){this.b=a;this.f=b||function(){};this.d=!1;this.a={};this.c=[];this.e=p(this);r(this,a,!c);var d=a.push,e=this;a.push=function(){var b=[].slice.call(arguments,0),c=d.apply(a,b);r(e,b);return c}}window.DataLayerHelper=n;n.prototype.get=function(a){var b=this.a;a=a.split(".");for(var c=0;c<a.length;c++){if(void 0===b[a[c]])return;b=b[a[c]]}return b};n.prototype.flatten=function(){this.b.splice(0,this.b.length);this.b[0]={};s(this.a,this.b[0])};
    function r(a,b,c){for(a.c.push.apply(a.c,b);!1===a.d&&0<a.c.length;){b=a.c.shift();if("array"==h(b))a:{var d=b,e=a.a;if("string"==h(d[0])){for(var f=d[0].split("."),u=f.pop(),d=d.slice(1),l=0;l<f.length;l++){if(void 0===e[f[l]])break a;e=e[f[l]]}try{e[u].apply(e,d)}catch(v){}}}else if("function"==typeof b)try{b.call(a.e)}catch(w){}else if(m(b))for(var q in b)s(t(q,b[q]),a.a);else continue;c||(a.d=!0,a.f(a.a,b),a.d=!1)}}
    function p(a){return{set:function(b,c){s(t(b,c),a.a)},get:function(b){return a.get(b)}}}function t(a,b){for(var c={},d=c,e=a.split("."),f=0;f<e.length-1;f++)d=d[e[f]]={};d[e[e.length-1]]=b;return c}function s(a,b){for(var c in a)if(k(a,c)){var d=a[c];"array"==h(d)?("array"==h(b[c])||(b[c]=[]),s(d,b[c])):m(d)?(m(b[c])||(b[c]={}),s(d,b[c])):b[c]=d}};})();
    
    消息 每个消息都等于dataLayer.push。它是仅在侦听器回调中有效的对象

    模型 模型保持发送的所有数据层信息的不断更新的模型。它在每个侦听器迭代中更新

    模型通过消息更新

    你的案子
    该数据层位于页面上的何处?请记住,DTM是同步加载的-这意味着它从上到下加载,UI数据元素通常在页面加载的早期设置。如果数据层是异步加载的,或者直到稍后才可用,则数据元素、脚本或变量将返回未定义的数据层是标准GTM数据层对象,与主GTM代码一起初始化(就在开口下方)。DTM prop1规则设置为在“DOM就绪”时启动,因此我猜数据层应该在那时创建。我错了吗?我知道您已经说过GTM数据层在开口下方初始化,但“虚拟PV”是什么时候对象推到数据层上?这似乎是创建独立于平台的数据层的一个很好的工具,如果它在这种情况下起作用,这可能是我需要的。您认为是否可以通过GTM使用此库(避免额外开发将是一个大问题+)?我将尝试一下,并提供一些见解:)@chilliq-是的,它是独立于平台的,您可以使用它创建非常定制的跟踪器。它是GTM的内部部分,所以我不建议您在同一个系统中再次实现它。但如果你把它放在DTM中,它肯定工作得很完美!我用这个助手建立了数十个自定义跟踪器。
    (function(){/*
     jQuery v1.9.1 (c) 2005, 2012
     jQuery Foundation, Inc. jquery.org/license.
    */
    var g=/\[object (Boolean|Number|String|Function|Array|Date|RegExp)\]/;function h(a){return null==a?String(a):(a=g.exec(Object.prototype.toString.call(Object(a))))?a[1].toLowerCase():"object"}function k(a,b){return Object.prototype.hasOwnProperty.call(Object(a),b)}function m(a){if(!a||"object"!=h(a)||a.nodeType||a==a.window)return!1;try{if(a.constructor&&!k(a,"constructor")&&!k(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}for(var c in a);return void 0===c||k(a,c)};/*
     Copyright 2012 Google Inc. All rights reserved. */
    function n(a,b,c){this.b=a;this.f=b||function(){};this.d=!1;this.a={};this.c=[];this.e=p(this);r(this,a,!c);var d=a.push,e=this;a.push=function(){var b=[].slice.call(arguments,0),c=d.apply(a,b);r(e,b);return c}}window.DataLayerHelper=n;n.prototype.get=function(a){var b=this.a;a=a.split(".");for(var c=0;c<a.length;c++){if(void 0===b[a[c]])return;b=b[a[c]]}return b};n.prototype.flatten=function(){this.b.splice(0,this.b.length);this.b[0]={};s(this.a,this.b[0])};
    function r(a,b,c){for(a.c.push.apply(a.c,b);!1===a.d&&0<a.c.length;){b=a.c.shift();if("array"==h(b))a:{var d=b,e=a.a;if("string"==h(d[0])){for(var f=d[0].split("."),u=f.pop(),d=d.slice(1),l=0;l<f.length;l++){if(void 0===e[f[l]])break a;e=e[f[l]]}try{e[u].apply(e,d)}catch(v){}}}else if("function"==typeof b)try{b.call(a.e)}catch(w){}else if(m(b))for(var q in b)s(t(q,b[q]),a.a);else continue;c||(a.d=!0,a.f(a.a,b),a.d=!1)}}
    function p(a){return{set:function(b,c){s(t(b,c),a.a)},get:function(b){return a.get(b)}}}function t(a,b){for(var c={},d=c,e=a.split("."),f=0;f<e.length-1;f++)d=d[e[f]]={};d[e[e.length-1]]=b;return c}function s(a,b){for(var c in a)if(k(a,c)){var d=a[c];"array"==h(d)?("array"==h(b[c])||(b[c]=[]),s(d,b[c])):m(d)?(m(b[c])||(b[c]={}),s(d,b[c])):b[c]=d}};})();
    
    function listener(message, model) {
      // Message has been pushed. 
      // The helper has merged it onto the model.
      // Now use the message and the updated model to do something.
    }
    var helper = new DataLayerHelper(dataLayer, listener, true);
    
    function listener(message, model) {
    
       if(message.event == "Virtual PV"){
           s.prop1=model.page;
           s.t();
       }
    
    }
    var helper = new DataLayerHelper(dataLayer, listener, true);