<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事件期间一样显示为“未定义”。
有人可以告诉我为什么会这样吗?
答案 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');