有没有人使用动态标记管理器成功使用页面上的s.contextData []变量?

时间:2014-03-13 08:35:43

标签: adobe-analytics

我们正在从Adobe跟踪代码管理器2迁移网站 - >动态标记管理器。

这个站点在页面中设置了各种s.contextData []变量,我们正在尝试重新利用它们来实现我们的DTM,但是看起来使用DTM的s对象直到页面代码完成之后才会创建。加载,导致" s未定义"错误。

(相比之下,对于TM2,s对象在加载HTML文件的底部之前就已存在,因此创建s属性不会造成任何问题。)

有没有人使用带有DTM的页内s.contextData?

3 个答案:

答案 0 :(得分:4)

首先,我想提前为tl; dr。道歉。但是,我觉得所有的解释都是必要的,这样你就可以(更多)完全理解这些问题,因为它不是一个真正需要克服的简单问题。

好的,有几件事情对你不利,并且有几个解决方案,取决于你最终想要实现的目标。

问题#1:命名空间

最直接的问题是 DTM无法输出全局命名空间中的s对象;它被隐藏在_satellite对象的某个地方。

现在,有(非官方的)方法可以将s对象放在全局命名空间中,具体取决于您如何包含Adobe Analytics核心代码。例如,在Adobe Analytics工具配置部分中,在&#34; general&#34;可扩展的,如果你将它设置为&#34; managed&#34;并将其粘贴到您使用&#34;打开编辑器&#34;打开的代码块中,您可以自己实例化s对象,与传统s_code.js文件中的内容相同:< / p>

var s = s_gi('rsid here');

这会将s对象写入全局命名空间。但是,这有一个副作用 - 它覆盖了你在&#34;帐号&#34;中指定的DTM的内置prod / staging rsids。配置顶部的部分。国际海事组织这并没有什么大的损失,因为这个设置开始时非常无用。

首先,如果您的实施使用动态帐户列表(DAL),则不会考虑。如果您已经在使用AppMeasurement库而不是遗留代码,则无论如何都会删除DAL。但大多数人仍在使用旧版s_code.js的某个版本(版本&lt; = H26.2),并且有相当一部分人使用DAL。

DTM根本不提供任何类型的&#34; DAL&#34;机制,超出使用prod与stage脚本时输出的内容包括(或覆盖调试cookie以指向分段)。好消息是,如果 使用DAL,您可以使用核心代码将其放入常规配置中,它将起作用。但同样,只有遗留代码库。即使是迁移,DTM也会促使您使用AppMeasurement代码库,而AppMeasurement也不支持DAL。

但是,那些&#34;动态&#34;帐号仅在物理输出登台与生产脚本时激活(或使用dtm调试cookie覆盖prod)。在实践中,没有人希望根据环境物理输出2个单独的代码标签,因为如果你使用像git或svn这样的版本控制系统,这并不能很好地解决问题。我不知道DTM人员在做这件事时会想到什么但是......无论如何。我只包括生产脚本include然后根据环境弹出调试cookie(这是他们应该在他们的界面中提供的开始...但是,无论如何)。反正...

问题#2:脚本执行顺序

第二个(与您的问题更重要/相关),即使您将s对象设为全局,也存在代码执行顺序与时间问题。即使您在配置中将其设置为&#34;在[Page Top]&#34;上加载Adobe Analytics代码,它仍然会成为一个问题。标题中包含的主要DTM脚本将在您的页面s.contextData执行之前执行,但是,DTM不会直接输出Adobe Analytics代码作为代码。相反,它将其输出为自己的脚本包含。您可以通过浏览器中的开发人员控制台(或firefox上的firebug,或者像charles代理这样的常规数据包嗅探器)来查看。您将看到satelliteLib-[id string]脚本包含,然后是s-code-contents-[id string]的单独请求。

在我尝试剖析其混淆代码时,我可以告诉s-code-contents-[id string] 假设输出document.writetheoretically表示它应该在您稍后在页面中设置s.contextData之前输出。此外,除非我读错了,this chart 似乎以确认这是应该如何工作的。

但是,这不是我在测试中看到的情况。当我在各个地方输出console.log('calling from [location]')时,我发现在实例化s对象之前,页面上的代码一直在输出。

老实说,我觉得这里有一个错误,或者至少是关于订单执行的误解,但我仍然犹豫不决。但这就是我所看到的(始终如一)并且它似乎与图表排列在一起。这些是console.log()我在不同地方发出的电话,以及// notes关于它们的位置:

page load - top - sequential html             // this is a page load rule set for top, console log is set with sequential html call
page load - top - sequential js               // this is a page load rule set for top, console log is set with sequential js call. 
hello from on-page                            // this is an on-page js code block between top and bottom satellite code
readyState: loading                           // this is in same code block as above, to show current document.readyState
calling config general                        // this is inside the adobe analytics main config "managed" code block, and the config is set to execute the adobe tag on "page top"
readyState: interactive                       // this is also inside the "managed" code block
page load - bottom analytics                  // this is page rule set for bottom, console log is within adobe analytics tag custom code section in the rule
page load - top - adobe analytics custom code // this is a separate page load rule set to execute on top. console log is also in adobe analytics custom code.

所以,我不知道这是否是DTM代码中的错误,或者我是否误解了事物的定义或者什么......但这似乎与所显示的内容不一致几个地方的图表(与#34; DTM图书馆加载&#34;上面图表链接右侧的文字相比),以及IMO与我对什么&#34; Page Top&#的期望不一致34;应该意味着。不管怎么说..

如何解决问题

好的,既然你(希望)理解了2个主要问题(命名空间和执行顺序),你应该(希望)能够从那里开始。虽然文档确实在某种程度上暗示了这里和那里的内容,但实际上还没有正式记录的方法来处理这个问题。那么&#34;最好的&#34;解决这个问题的方法取决于你的其他东西是如何设置的。

但这是我如何处理这个问题的一个例子。在Adobe Analytics配置中,我定义了s_doPlugins。这可以进入managed代码块或customize code page代码块,但是如果将它放在托管中,则必须自己实例化s对象(请参阅问题#1的方法)最佳)。现在,您可能会问自己,为什么我可以在制作复制它的DTM规则时定义s_doPlugins。简短的回答是DTM不能准确地或可行地复制s_doPlugins,这是一个大问题,特别是对于正在迁移并且已经具有依赖于该功能的实现的人。 除此之外,还存在DTM向导覆盖和/或未在规则的自定义代码部分中正确设置Adobe Analytics变量的错误,但这是一个完整的其他话题 (这已得到修复)。长话短说,我在配置中定义s_doPlugins以解决DTM的限制/错误。

因此,对于s_doPlugins,我有以下代码:

s.usePlugins=true
function s_doPlugins(s) {
  if (typeof window['dtm_s']=='object') {
    for (var v in window['dtm_s']) {
      if (window['dtm_s'].hasOwnProperty(v)) {
        s[v] = window['dtm_s'][v];
      }
    }
  }
}
s.doPlugins = s_doPlugins;

然后,对于我的页面自定义代码,我将其更改为此(示例):

<script type="text/javascript">
var dtm_s = {
  'pageName' : 'some page',
  'prop1' : 'some value',
  'contextData' : {
    'foo' : 'bar',
    'another' : 'context var'
  }
};
</script>

所以这一切都是......

1)现在我可以像传统的omniture代码一样放置页面代码。如果您希望更容易迁移,请不要将s放在DTM的全局命名空间中(而是在自定义部分中定义s_doPlugins)。然后在您的页面代码之前的某个位置创建一个虚拟的ss.contextData对象:

var s = {'contextData':{}};

更新s_doPlugin循环以查找window['s']而不是'dtm_s',然后您可以按原样保留页面上的自定义代码(减去s_code.js脚本当然包括和s.t触发器。我通常使用dtm_s命名空间来执行此操作,因为坦率地说,s命名空间太短,并且因为它而多次遇到名称空间冲突问题,所以IMO值得努力改变它。

2)由于s_doPlugins现已定义,因此会在每次s.ts.tl调用时执行此操作,与传统操作相同。代码本身的作用是查找dtm_s有效负载并弹出Adobe Analyics变量。关于这一点的好处是s_doPlugins在 DTM的逻辑之后被称为,它弹出/覆盖来自它的&#34;形式向导&#34;的东西,所以这可以绕过那些&#34;向导&#34;错误(对话的难题)。

注意:有一件事可以在这方面得到改善(我确实这样做了,但我保持简单,例如清酒)就是利用这个原则来填充而是DTM数据元素,然后将其路由到Adobe Analytics代码。这样,数据也会暴露给DTM以用于其他标签和规则,而不仅仅是Adobe Analytics。

答案 1 :(得分:1)

作为一种解决方法,您是否尝试将[Javascript / Third Party Tags]框中全局所需的代码作为Javascript添加,并选中[全局执行]复选框。此外,您可能希望在页面顶部中加载代码。我的[Adobe Analytics]和[Javascript / Third Party Tags]框中的代码都可以访问“全局”代码。它对我有用!

答案 2 :(得分:0)

我知道这是一个老问题,但是在尝试确定如何在页面加载规则中从非顺序JavaScript中激活一些自定义s.tl()调用时遇到了这个问题。这是一个利用AppMeasurement的新实现,完全是Marketing Cloud托管代码。

这不是一个经过全面测试的解决方案,但目前似乎正在使用。

  1. 创建新的数据元素。我把它命名为dtm_s_object。我还设置了我们的开发报告套件的默认设置,只是为了安全。
  2. 在元素中,我输入以下代码:

    var adobe_obj = _satellite.tools["INSERT YOUR ADOBE TOOL ID"];
    var adobe_rsid = adobe_obj.settings.account;
    return s_gi(adobe_rsid);
    
  3. 然后,在您的规则中,您可以设置一个在代码中使用的局部变量,如下所示:

    var s = _satellite.getVar('dtm_s_object');
    s.tl(true, 'o', 'foo');
    
  4. 要获取Adobe Analytics Tool ID,您只需在控制台中键入:_satellite.tools,然后按Enter键。然后,您可以浏览以确定哪个是Adobe Analytics。