我们正在从Adobe跟踪代码管理器2迁移网站 - >动态标记管理器。
这个站点在页面中设置了各种s.contextData []变量,我们正在尝试重新利用它们来实现我们的DTM,但是看起来使用DTM的s对象直到页面代码完成之后才会创建。加载,导致" s未定义"错误。
(相比之下,对于TM2,s对象在加载HTML文件的底部之前就已存在,因此创建s属性不会造成任何问题。)
有没有人使用带有DTM的页内s.contextData?
答案 0 :(得分:4)
首先,我想提前为tl; dr。道歉。但是,我觉得所有的解释都是必要的,这样你就可以(更多)完全理解这些问题,因为它不是一个真正需要克服的简单问题。
好的,有几件事情对你不利,并且有几个解决方案,取决于你最终想要实现的目标。
问题#1:命名空间
最直接的问题是 DTM无法输出全局命名空间中的s
对象;它被隐藏在_satellite
对象的某个地方。
现在,有(非官方的)方法可以将s
对象放在全局命名空间中,具体取决于您如何包含Adobe Analytics核心代码。例如,在Adobe Analytics工具配置部分中,在" general"可扩展的,如果你将它设置为" managed"并将其粘贴到您使用"打开编辑器"打开的代码块中,您可以自己实例化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.write
,theoretically
表示它应该在您稍后在页面中设置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
)。然后在您的页面代码之前的某个位置创建一个虚拟的s
和s.contextData
对象:
var s = {'contextData':{}};
更新s_doPlugin
循环以查找window['s']
而不是'dtm_s'
,然后您可以按原样保留页面上的自定义代码(减去s_code.js
脚本当然包括和s.t
触发器。我通常使用dtm_s
命名空间来执行此操作,因为坦率地说,s
命名空间太短,并且因为它而多次遇到名称空间冲突问题,所以IMO值得努力改变它。
2)由于s_doPlugins
现已定义,因此会在每次s.t
和s.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托管代码。
这不是一个经过全面测试的解决方案,但目前似乎正在使用。
在元素中,我输入以下代码:
var adobe_obj = _satellite.tools["INSERT YOUR ADOBE TOOL ID"];
var adobe_rsid = adobe_obj.settings.account;
return s_gi(adobe_rsid);
然后,在您的规则中,您可以设置一个在代码中使用的局部变量,如下所示:
var s = _satellite.getVar('dtm_s_object');
s.tl(true, 'o', 'foo');
要获取Adobe Analytics Tool ID,您只需在控制台中键入:_satellite.tools
,然后按Enter键。然后,您可以浏览以确定哪个是Adobe Analytics。