3

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

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

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

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

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

我在 Adob​​e DTM 中所做的:

  1. 将自定义数据元素“dataLayer - pageview - page1”设置为自定义脚本(脚本返回字符串“/page1”,应将其作为“prop1”添加到 Adob​​e Analytics:

    var 结果 = dataLayer.filter(function( obj ) {
        return obj.event == '虚拟 PV';
        });
    返回结果[0].pageview
    
  2. 设置页面加载规则(在 DOM 就绪时启动)并将“prop1”变量设置为:%dataLayer - pageview - page1%。

prop1="%dataLayer - 网页浏览量 - page1%"

从理论上讲,这个设置应该可以工作,并且每个页面浏览都应该有一个 prop1 = "/page1",但是在控制台中我看到了错误:

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

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

4

1 回答 1

3

使用数据层助手

为此目的设计的精彩库: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);
于 2016-04-05T14:20:15.617 回答