如果我有一个预定义的数据元素叫做" CS Test"如此:
return (function() {
var rvalue = "default custom script value from some data layer";
return rvalue;
})();
我想更新" CS Test"具有新值的数据元素(例如"更新值")基于基于事件的规则。我无法让它发挥作用?我从上一篇文章中了解到,当您明确调用_satellite.getVar('示例')时,操作顺序是:
所以不确定如何解决这个问题,因为数据元素代码总是被执行并返回一个值?
答案 0 :(得分:2)
我的观点是更新卫星cookie有效,但直到我调用最后一个_satellite.getVar(" CS Test"),因为它用数据元素代码的值覆盖卫星cookie并返回数据元素的值。
好的,我将在这里列出几个不同的想法,因为你已经清楚你的数据元素功能真正做了什么,你想要实现什么,等等。所以,其中一些可能会澄清DTM的工作原理,并帮助您达到您需要的位置。
仅直接设置数据元素的cookie"工作"用于在DTM内部引用它时更新它,例如(如上所述)后续页面加载。此外,我认为(但尚未测试)在规则字段中使用%data_element%
语法时它将起作用。
但是,as mentioned here(我在OP评论中发布的相同链接),当您明确地调用_satellite.getVar()
时,它会强制评估您的数据元素规则。这意味着你在那里的代码(你的匿名函数)将被执行,并做它做的任何事情。
它听起来就好像你想让DTM以某种方式执行它,但有选择地忽略其中一些。嗯,DTM无法做到这一点。如果你想要这样的事情发生,那么你必须重写你的匿名函数以适应这样的事情。但是我会马上回到这一点,因为首先我想退一步问......
为什么你甚至在写完cookie后立即使用_satellite.getVar()
?直接写入cookie的关键是你绕过数据元素。更重要的是,你已经拥有了这个价值,因为你只需要用它设置cookie 。
因此,为了示例,您可能只是整合了代码,并且后续.getVar()
调用位于单独的代码框中,或者在您设置cookie的范围之外。
如上所述,当您明确调用.getVar()
时,DTM返回值的操作顺序为
评估数据元素。这意味着你的匿名函数会 执行。如果这返回真值,那就是你得到的。如果它 不会返回真正的价值..
如果它是持久性数据元素,DTM将查找_sdsat_[data
element name]
cookie。如果它存在(并具有真实价值),那就是
你得到什么。如果没有,那么......
返回您指定的值作为数据中的默认值 element config(如果你没有指定任何内容,则为undefined)
所以再一次,我在黑暗中有点射击,因为我不知道你的数据元素和最终目标的细节,但它听起来像你希望能够调用.getVar()
但操作顺序与DTM在页面加载时的操作方式相同(1和2相反)。嗯,DTM没有内置的方法来做到这一点。如果Adobe在数据元素配置中添加选项以指定操作顺序,那将是很好的,因为显然它的行为有所不同,具体取决于数据元素的引用方式(无论是DTM本身还是由您引用)。但他们此时并没有这样做。
因此,如果这是您想要的,那么您需要重构您的匿名函数,使其更像DTM与持久数据层的行为。基本上,添加代码来查找cookie的默认值为rvalue
,然后会回到现在的状态。这应该允许您对.getVar()
进行显式调用,因为现在首先执行的匿名函数将首先查找cookie值。
另一种选择可能是......假设所有这些代码(即麻烦的后续.getVar()
调用)都在同一规则内,但无论出于什么原因超出了你在第一个范围内设置cookie的范围在(例如,在单独的代码框中),您可以将值设置为不同的,即时创建的数据元素,然后引用它。以这种方式执行此操作而不仅仅是读取cookie的好处是,它将它暴露给数据元素,以便您还可以使用%data_element%
语法(从您设置它的位置,向前移动),如果您需要。
<强>更新强>
好的,根据后续评论,我正在玩DTM,看起来你可以做以下事情,这可能就是你要找的东西。
页面范围持久性
例如,在预定义的数据元素中,您可以使用以下内容:
return function(rvalue) {
_satellite.data.customVars._defaultRvalue =
rvalue
||
_satellite.data.customVars._defaultRvalue
||
"default custom script value from some data layer"
;
return _satellite.data.customVars._defaultRvalue;
}
然后,要获得当前值,您可以这样做:
_satellite.getVar('data_element')();
这将返回当前值或&#34;默认[..]&#34;如果没有。
然后,如果要设置新值,可以执行以下操作:
_satellite.getVar('data_element')('new value');
这将返回&#34;新值&#34;,如果您进行后续调用(页面范围):
_satellite.getVar('data_element')();
它将继续返回&#34;新价值&#34;。
示例场景:
_satellite.getVar('data_element')(); // initial page load, returns "default[..]"
_satellite.getVar('data_element')('foo'); // returns 'foo'
_satellite.getVar('data_element')(); // returns 'foo'
_satellite.getVar('data_element')('bar'); // returns 'bar'
_satellite.getVar('data_element')(); // returns 'bar'
注意:这仅适用于页面的持续时间。如果您需要它在页面之间保持不变,则需要设置并从cookie中绘制。不要使用_sdsat_[data_element]
cookie,因为函数本身存储在cookie中。
会话+持久性(从页面加载持续到页面加载)
因此,为了在整个会话期间保持它,从一个页面到另一个页面,您可以执行此操作,例如:
return function(rvalue) {
var rvalue=
rvalue
||
_satellite.readCookie('rvalue')
||
"default custom script value from some data layer"
;
_satellite.setCookie('rvalue',rvalue);
return _satellite.readCookie('rvalue');
}
示例场景:
_satellite.getVar('data_element')(); // initial page load, returns "default[..]"
_satellite.getVar('data_element')('foo'); // still on same page, returns 'foo'
_satellite.getVar('data_element')(); // still on same page, returns 'foo'
// reload page or go to new page:
_satellite.getVar('data_element')(); // new page: returns 'foo'
_satellite.getVar('data_element')('bar'); // returns 'bar'
// reload page or go to new page:
_satellite.getVar('data_element')(); // new page: returns 'bar'
注意:关于这样做的一个主要警告是,因为您实际上使.setVar
方法成为函数的包装器,所以您将无法在表单字段中引用它具有%data_element%
语法的规则。好吧,你可以,但它不会给你你想要的东西。在我的测试中,它返回函数本身的字符串化版本,但是谁知道它可能会如何反应,具体取决于浏览器/版本。不要这样做。