数据图层变量在 GTM 自定义 HTML 标记中不会动态更改


<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变量时,将不确定,但在用户交互后可以更改它。当发生" nunload"事件发生时,{{bounce_checker}}如果存在任何用户交互,则显示'value_lead'。

但是数据层变量没有动态变化。它总是像在DOM事件期间一样以"未定义"的形式出现。

有人可以告诉我为什么会发生这种情况吗?

在此代码中,您添加了一个侦听器,该侦听器利用{{bounce checker}} ar的值创建侦听器的那一刻,例如。不明确的。GTM不会更新该变量,因为它不是常规JS对象,而是评估某些值的表达式。考虑将某些事件切换到" toreNunload"上的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>

谢谢 @ @ @ @。这就说得通了。我还有其他解决方法可以解决我的问题,例如使用...循环或foreach循环手动解析数据层。

    (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');
    }

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

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

最新更新