仅在 gtm 脚本完全加载到页面上后才使用 dataLayer.push 触发自定义事件

fire custom event using dataLayer.push only after gtm script has fully loaded on page

提问人:oldbhoy 提问时间:10/12/2023 最后编辑:oldbhoy 更新时间:10/13/2023 访问量:52

问:

我有一个使用 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 容器中配置标签来处理这个问题?

javascript google-analytics google-tag-manager google-datalayer

评论


答:

0赞 darrelltw 10/13/2023 #1

您无需等待 GTM 容器加载即可推送数据层。

只需使用这样的代码

window.dataLayer = window.dataLayer || [];
window.dataLayer.push(...something you need) 

以这种方式。即使您在 GTM 加载之前推送信息。GTM 仍然可以获取信息并触发标签或获取所需的数据。

也就是说,这是一个事件。 看到数据层在之前并不奇怪。 而且所有的跟踪都还好。view_itemview_itempage_view