google-tag-manager - dataLayer 变量在 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 就绪事件中部署为自定义 HTML 标记。在触发 {{bounce_checker}} 时,dataLayer 变量将未定义,但已设置为在用户交互后更改。当 'beforeunload' 事件发生时,如果有任何用户交互,{{bounce_checker}} 将显示 'value_lead' 否则为 'bounced_user'。
但是数据层变量不是动态变化的。它总是像在 DOM 事件期间一样显示为“未定义”。
谁能告诉我为什么会这样?
解决方案
使用此代码,您可以添加一个侦听器,该侦听器利用 {{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>
推荐阅读
- asp.net-core - 以 DbContext 为目标的自定义 ILoggerProvider 的最佳实践/模式
- javascript - 从 D3 中的列表中获取元素属性
- python - 如何使用正则表达式从文本中解析缺少子字符串的子字符串
- python - 有条件地连接两个字符串列
- npm - 观察 src 目录的变化,然后运行传递文件名和相对路径的 npm 脚本
- r - 如何使用文本框在 R 中读取 excel
- mysql - 是否可以在 UPDATE 的 WHERE 部分使用 Max()
- python - tf.distribute.Strategy:TypeError:无法转换类型的对象
张量 - openssl - 使用 openssl s_client 命令与谷歌邮件连接
- css - SVG 变换作为样式表属性(与 CSS 变换相反)