dataLayer变量未在GTM自定义HTML标签内动态更改

时间:2018-12-18 03:28:09

标签: google-tag-manager google-datalayer

<script>
   console.log({{bounce_checker}});
   (function(){
   window.addEventListener('beforeunload',checker, false);})();
   function checker(event){
   event.preventDefault();
   console.log(event.type);
   console.log({{bounce_checker}});
   var validator = {{bounce_checker}};
   if(validator == "value_lead")
    {console.log('value_lead');}
   else if(validator == undefined)
    {console.log('bounced_user');}   
   </script>

以上代码在DOM ready事件中作为自定义HTML标记部署。触发{{bounce_checker}}时,dataLayer变量将是未定义的,但设置为在用户交互后更改。当发生“ beforeunload”事件时,如果有其他用户交互,则{{bounce_checker}}将显示“ value_lead”。

但是数据Layer变量并没有动态更改。它总是像DOM事件期间一样显示为“未定义”。

有人可以告诉我为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

使用此代码,您可以添加一个监听器,该监听器在创建监听器时即使用{{bounce checker}}的值。未定义。 GTM不会更新该变量,因为它不是常规的js对象,而是计算结果为某个值的表达式。 考虑切换到在“ beforeunload”上将一些事件推送到dataLayer并在由自定义事件触发的自定义HTML标记处处理{{bounce checker}}值,例如:

<!--DOM Ready Custom HTML Tag code -->
<script>
  window.addEventListener('beforeunload',function(e) {dataLayer.push({'event':'beforeunload'})}, false);
</script>

<!--beforeunload Custom Event Custom HTML Tag code -->
<script>
  console.log({{bounce_checker}});
  var validator = {{bounce_checker}};
  if(validator == "value_lead") {
    console.log('value_lead');
    // further processing of {{bounce_checker}} value
    // ...
  }
  else if(validator == undefined) {
    console.log('bounced_user');
    // further processing of {{bounce_checker}} value
    // ...
  }   
</script>

答案 1 :(得分:0)

谢谢@ДмитроБулах。那讲得通。我还有其他解决方法,可以解决我的问题,例如使用for ... loop或forEach循环手动解析dataLayer。

(function(){
window.addEventListener('beforeunload',checker, false);})();
function checker(event){
console.log(event.type);
console.log({{bounce_checker}});
var i;
var arr = window.dataLayer;
for(i=0; i<=arr.length; i++)
{ if(typeof(arr[i]) === 'undefined'){console.log('caught error')}
else if(arr[i].bounced_user){
var validator = arr[i].bounced_user;}else{}
};
console.log({{bounce_checker}});
console.log(validator);
if(validator == "value_lead"){console.log('value_lead');}
else if(validator == undefined){console.log('bounced_user');}   
console.log('testing success');}
</script>

另外,在GTM社区论坛中,Simo Ahava建议我使用

var validator = window.google_tag_manager[{{container_ID}}].dataLayer.get('bounce_checker');