提问人:oldbhoy 提问时间:10/12/2023 最后编辑:oldbhoy 更新时间:10/13/2023 访问量:52
仅在 gtm 脚本完全加载到页面上后才使用 dataLayer.push 触发自定义事件
fire custom event using dataLayer.push only after gtm script has fully loaded on page
问:
我有一个使用 Google 跟踪代码管理器的网页。在加载过程中的某个时间点,页面从 API 获取数据,并通过函数“gtmPush”将部分数据推送到 dataLayer。在 google 跟踪代码管理器容器中配置了自定义事件代码,以在此推送事件上触发。
const ecommerceEvents = [<"array of valid ecommerce event strings">];
function gtmPush(eventname, params) {
console.log("Firing GA4 event: " + eventname);
let eventdata = {};
// clear ecommerce object if it's an ecommerce event
if (ecommerceEvents.indexOf(eventname) !== -1) {
dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.
eventdata.ecommerce = params.meta;
} else {
eventdata = params.meta;
}
eventdata.event = eventname;
dataLayer.push(eventdata);
}
但是,这种方法有时才有效,因为在执行此代码时,GTM 并不总是准备就绪。我试图弄清楚如何在推动活动之前听取 GTM 的准备情况,但没有任何运气。
检查 dataLayer 对象和 gtmLoad 标志是否存在,让我绕过尝试立即推送事件,但我不确定如何在 GTM 加载时设置适当的事件侦听器。我看到的一个解决方案是将 gtmLoad 事件与 eventCallback 一起推送到 dataLayer:
function checkGtmStatus(eventname, params) {
// Is GTM ready?
if (window.google_tag_manager.dataLayer && "gtmLoad" in window.google_tag_manager.dataLayer && window.google_tag_manager.dataLayer.gtmLoad) {
gtmPush(eventname, params);
return;
}
// Not ready yet, wait for gtmLoad event to fire
dataLayer.push({
"event": "gtmLoad",
"eventCallback": gtmPush(eventname, params)
}
}
相反,这会触发多次(准确地说,总是 3 次),而不是像预期的那样只触发一次。这不一定是 Tag Manager Assistant 的问题,正如在单独的帖子中建议的那样,因为如果不通过 TMA 运行,我会看到 gtmPush 的 console.log 语句 3 次。
我还尝试将函数回调添加到window.load中,作为dataLayer方法的替代方法,
window.addEventListener('load', function() {
gtmPush(eventname, params);
});
但标签再次不一致地触发。
有没有一种特定的方法来监听 GTM 完成它的设置?或者,有没有办法在 GTM 容器中配置标签来处理这个问题?
答:
您无需等待 GTM 容器加载即可推送数据层。
只需使用这样的代码
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(...something you need)
以这种方式。即使您在 GTM 加载之前推送信息。GTM 仍然可以获取信息并触发标签或获取所需的数据。
也就是说,这是一个事件。
看到数据层在之前并不奇怪。
而且所有的跟踪都还好。view_item
view_item
page_view
评论