更新:YannisG 关于这个主题的一篇有趣的文章:http://digitalinsightsworld.com/tag-manager/push-datalayer-values-adobe-sitecatalyst-variables-via-dtm/

有一个安装了 Google Tag Manager 和 dataLayer 的网站。我想尝试使用相同数据层的另一种标签管理解决方案 (Adobe DTM),因此无需进行更多开发。

dataLayer 是一个对象列表。其中一个对象包含“pageview”属性,我想在所有页面浏览量上将其发送到 Adob​​e Analytics。

Object {
event: "virtual PV",
pageview: "/page1",
__proto__: Object}

假设我想从 dataLayer 的对象之一获取 pageview 属性并将其放入 Adob​​e Analytics“prop1”变量中。

我在 Adob​​e DTM 中做了什么:
  • 将自定义数据元素“dataLayer - pageview - page1”设置为自定义脚本(脚本返回字符串“/page1”,应将其作为“prop1”添加到 Adob​​e Analytics:
    var result = dataLayer.filter(function( obj ) {
        return obj.event == 'virtual PV';
        });
    return result[0].pageview
    
  • set a page load rule (launched at DOM ready) and set "prop1" variable as: %dataLayer - pageview - page1%.

  • prop1="%dataLayer - pageview - page1%"

    In theory this setup should work and every pageview should have a prop1 = "/page1", however in the console I see the error:

    SATELLITE: TypeError - Cannot read property 'pageview' of undefined
    

    可能是什么原因?当我在控制台中键入数据元素代码时 - 它会正确获取页面浏览值。也许 GTM 的 dataLayer 对象没有准备好,当 DTM 想要从中提取数据时,所以我应该延迟 DTM - 但是如何?

    最佳答案

    使用数据层助手

    为此目的而设计的精彩库:https://github.com/google/data-layer-helper

    它的工作原理与 GTM dataLayer 非常相似,但您可以自己设计。

    它是完全异步的!

    如何使用它?

    实现这个库:

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

    信息

    每条消息都等于 dataLayer.push。它是一个仅在监听器回调中有效的对象。

    模型

    模型不断更新所有发送的数据层信息的模型。它在每次监听器迭代时更新。

    模型通过消息更新。

    你的情况
    function listener(message, model) {
    
       if(message.event == "Virtual PV"){
           s.prop1=model.page;
           s.t();
       }
    
    }
    var helper = new DataLayerHelper(dataLayer, listener, true);
    

    关于javascript - Adobe DTM - 使用 GTM 数据层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35799300/

    10-12 07:12