何时以及如何在 Omniture 中使用 s.clearVars?
When and how to use s.clearVars in Omniture?
我想了解我可以在 DTM 中的什么地方使用 s.clearVars?我是将它放在全局配置下的 "custom page code" 下还是规则 "custom page code" 下?
清除所有变量的缺点是什么?我是否还要清除内置的 Omniture 变量(例如营销活动 ID)?或者在 DTM 中清除所有自定义(evar、道具和事件 - 我设置的东西)的最佳方法是什么?
我的 Ajax 应用程序似乎正在缓存每次调用的数据。我遇到以下问题。
http://trackingfirst.com/omniture-ajax-cache-issues/
热衷于了解 s.clearVars 如何在 DTM 中使用它。谢谢
我不确定我能否在无法全面评估您的 DTM 设置的情况下给出有关最佳解决方法的明确答案,但您可以尝试一件事:
在您最终进行 s.t
或 s.tl
调用的规则中,执行以下操作:
在条件部分,在规则条件下,选择数据>自定义并点击"Add Criteria" 按钮。
然后在代码框中,输入:
var s = _satellite.getToolsByType('sc')[0].getS();
s.clearVars();
return true;
更新:您评论了以下内容:
Thank you for your answer. Unfortunately my rules are all direct call rules and there seems to be no "condition" option in DTM. I have
added the above code under - "custom page code" - analytics tool
settings - but interestingly "custom page code" don't get call for
direct call rules. I am going to try running it via "javascript/3rd
party tags" see what happens. Other ideas I could try? thanks
你是对的,直接调用规则只有一个条件,那就是在_satellite.track('string')
调用中传递的字符串。老实说,我不知道 Adobe 为什么要这样做。也许有一天 Adobe 会扩展它以允许您为直接调用规则设置其他条件,并且基本上只是将 "string" 条件重新标记为直接调用规则标识符以指定要调用的规则。基本上,他们应该将其视为基于页面加载和事件的规则,除非您仅使用 "string" 调用它。顺便说一句,这就是在核心代码(甚至是页面加载和基于事件的规则)中已经在内部调用规则的方式,因此 Adobe 不会有太大的困难展开直接调用规则。
另外,你是对的,在工具设置中的"custom page code"部分添加代码也不行。该代码块仅在 DTM 库的初始加载时执行。说到在该自定义页面代码部分中设置内容。如果您要在那里设置其他 Omniture 变量,您还应该注意其他 "bugs"。长话短说,DTM 不只是在第一次加载时创建一个 s
对象,然后在稍后的规则中引用它;它会在触发规则时创建一个全新的 s
对象。因此,如果您在这些工具配置自定义代码框中设置任何内容(例如,手动设置 linkTrackVars
或更常见,使用 s_doPlugins
,这在被烘焙到 DTM 中时也明显缺失...)它们将不会为直接规则调用保留! (但是, 将其从直接调用保留到直接调用。我知道.. 令人困惑和不一致,对吧?)
所以这为您提供了一个解决方案。基本上,您需要禁用让 DTM 触发 s.t
或 s.tl
调用。只需将 Adobe Anlytics 部分中的单选按钮设置为 "disabled",然后在 Javascript/第三方标签[=65= 的代码框中设置您需要手动设置的所有内容] 部分。在那里,您可以放置该代码,然后设置您需要设置的任何其他 Omniture 变量。如果您需要引用数据元素,您可以使用 _satellite.getVar('element_name')
来获取它们,而不是您在 Adobe Analytics 部分中使用的 %element_name%
占位符。然后,以 s.t()
或 s.tl()
结束它给自己打电话。换句话说.. 将其视为普通的 Omniture 实施,其中代码恰好托管在 DTM 中,而不是使用 DTM 内置的任何内容。
更新:AppMeasurement 1.8.0
AppMeasurement Release Notes(向下滚动到 JavaScript 1.8.0)
Adobe 引入了两个您可以注册回调函数的事件:
s.registerPreTrackCallback
s.registerPostTrackCallback
有了这个,你可以注册一个触发s.clearVars()
的回调函数
例子
s.registerPreTrackCallback(function() {
s.clearVars();
});
我想出了一个非常简单的解决方案来实现 clearVars,它只需要重写 s.t() 以在每次调用后触发 clearVars。
您需要全局定义它,例如在 DTM 中的全局自定义代码中,以便它只运行一次:
// override s.t() to trigger clearVars after every call to it
var t_orig = s.t;
s.t = function(){
t_orig.apply(this, arguments);
try {
s.clearVars();
} catch(e){}
}
使用此解决方案,您永远不必担心意外清除由自定义脚本或基于事件的规则设置的变量。
第二种情况是当您在一个应用程序中有多个 s.tl() 调用时,您希望在一个事件和另一个事件之间清除 Vars() 以避免在下一个 s.tl()。
为此,在调用 s.tl() 之前,或在基于事件的 DTM 规则中自定义条件块的顶部,在自定义脚本中使用以下代码:
// clear pre-existing variables here, before anything new gets set
var s = _satellite.getToolsByType('sc')[0].getS(); // this line is optional and for use in DTM only; not necessary if you are sure your "s" object is already set to the correct reference.
s.clearVars();
更新
正如@CrayonViolent 提到的,从 AM 1.8.0 开始,Adobe 为此引入了回调方法:s.registerPreTrackCallback 和 s.registerPostTrackCallback。
我将在这里留下我原来的答案作为替代方法,因为使用内置函数和覆盖函数之间仍然存在差异,并且对事物时间的更细粒度控制可能会派上用场(对于例如,如果您想保证您的代码在任何其他已注册的回调之后触发。)
此外,我在第二种情况下概述的方法仍然有效,并且与使用 s.registerPreTrackCallback 不同,因为您可以根据自定义事件控制时间。
我想了解我可以在 DTM 中的什么地方使用 s.clearVars?我是将它放在全局配置下的 "custom page code" 下还是规则 "custom page code" 下?
清除所有变量的缺点是什么?我是否还要清除内置的 Omniture 变量(例如营销活动 ID)?或者在 DTM 中清除所有自定义(evar、道具和事件 - 我设置的东西)的最佳方法是什么?
我的 Ajax 应用程序似乎正在缓存每次调用的数据。我遇到以下问题。
http://trackingfirst.com/omniture-ajax-cache-issues/
热衷于了解 s.clearVars 如何在 DTM 中使用它。谢谢
我不确定我能否在无法全面评估您的 DTM 设置的情况下给出有关最佳解决方法的明确答案,但您可以尝试一件事:
在您最终进行 s.t
或 s.tl
调用的规则中,执行以下操作:
在条件部分,在规则条件下,选择数据>自定义并点击"Add Criteria" 按钮。
然后在代码框中,输入:
var s = _satellite.getToolsByType('sc')[0].getS();
s.clearVars();
return true;
更新:您评论了以下内容:
Thank you for your answer. Unfortunately my rules are all direct call rules and there seems to be no "condition" option in DTM. I have added the above code under - "custom page code" - analytics tool settings - but interestingly "custom page code" don't get call for direct call rules. I am going to try running it via "javascript/3rd party tags" see what happens. Other ideas I could try? thanks
你是对的,直接调用规则只有一个条件,那就是在_satellite.track('string')
调用中传递的字符串。老实说,我不知道 Adobe 为什么要这样做。也许有一天 Adobe 会扩展它以允许您为直接调用规则设置其他条件,并且基本上只是将 "string" 条件重新标记为直接调用规则标识符以指定要调用的规则。基本上,他们应该将其视为基于页面加载和事件的规则,除非您仅使用 "string" 调用它。顺便说一句,这就是在核心代码(甚至是页面加载和基于事件的规则)中已经在内部调用规则的方式,因此 Adobe 不会有太大的困难展开直接调用规则。
另外,你是对的,在工具设置中的"custom page code"部分添加代码也不行。该代码块仅在 DTM 库的初始加载时执行。说到在该自定义页面代码部分中设置内容。如果您要在那里设置其他 Omniture 变量,您还应该注意其他 "bugs"。长话短说,DTM 不只是在第一次加载时创建一个 s
对象,然后在稍后的规则中引用它;它会在触发规则时创建一个全新的 s
对象。因此,如果您在这些工具配置自定义代码框中设置任何内容(例如,手动设置 linkTrackVars
或更常见,使用 s_doPlugins
,这在被烘焙到 DTM 中时也明显缺失...)它们将不会为直接规则调用保留! (但是, 将其从直接调用保留到直接调用。我知道.. 令人困惑和不一致,对吧?)
所以这为您提供了一个解决方案。基本上,您需要禁用让 DTM 触发 s.t
或 s.tl
调用。只需将 Adobe Anlytics 部分中的单选按钮设置为 "disabled",然后在 Javascript/第三方标签[=65= 的代码框中设置您需要手动设置的所有内容] 部分。在那里,您可以放置该代码,然后设置您需要设置的任何其他 Omniture 变量。如果您需要引用数据元素,您可以使用 _satellite.getVar('element_name')
来获取它们,而不是您在 Adobe Analytics 部分中使用的 %element_name%
占位符。然后,以 s.t()
或 s.tl()
结束它给自己打电话。换句话说.. 将其视为普通的 Omniture 实施,其中代码恰好托管在 DTM 中,而不是使用 DTM 内置的任何内容。
更新:AppMeasurement 1.8.0
AppMeasurement Release Notes(向下滚动到 JavaScript 1.8.0)
Adobe 引入了两个您可以注册回调函数的事件:
s.registerPreTrackCallback
s.registerPostTrackCallback
有了这个,你可以注册一个触发s.clearVars()
例子
s.registerPreTrackCallback(function() {
s.clearVars();
});
我想出了一个非常简单的解决方案来实现 clearVars,它只需要重写 s.t() 以在每次调用后触发 clearVars。
您需要全局定义它,例如在 DTM 中的全局自定义代码中,以便它只运行一次:
// override s.t() to trigger clearVars after every call to it
var t_orig = s.t;
s.t = function(){
t_orig.apply(this, arguments);
try {
s.clearVars();
} catch(e){}
}
使用此解决方案,您永远不必担心意外清除由自定义脚本或基于事件的规则设置的变量。
第二种情况是当您在一个应用程序中有多个 s.tl() 调用时,您希望在一个事件和另一个事件之间清除 Vars() 以避免在下一个 s.tl()。
为此,在调用 s.tl() 之前,或在基于事件的 DTM 规则中自定义条件块的顶部,在自定义脚本中使用以下代码:
// clear pre-existing variables here, before anything new gets set
var s = _satellite.getToolsByType('sc')[0].getS(); // this line is optional and for use in DTM only; not necessary if you are sure your "s" object is already set to the correct reference.
s.clearVars();
更新
正如@CrayonViolent 提到的,从 AM 1.8.0 开始,Adobe 为此引入了回调方法:s.registerPreTrackCallback 和 s.registerPostTrackCallback。
我将在这里留下我原来的答案作为替代方法,因为使用内置函数和覆盖函数之间仍然存在差异,并且对事物时间的更细粒度控制可能会派上用场(对于例如,如果您想保证您的代码在任何其他已注册的回调之后触发。)
此外,我在第二种情况下概述的方法仍然有效,并且与使用 s.registerPreTrackCallback 不同,因为您可以根据自定义事件控制时间。