我正在使用Google跟踪代码管理器以及Webpack加载的javascript。
(在我页面的head
标记中,我首先拥有GTM加载脚本,然后我有Webpack编译的manifest.js
,vendor.js
和page-specific.js
。)
如果我通过GTM加载某个javascript库(在我的情况下,我将Facebook Pixel作为自定义标记),我如何指示我的page-specific.js
中的函数等到Facebook Pixel标签已由GTM加载?
(函数调用fbq('track', 'Purchase', {value: facebookTrackingPurchaseValue, currency: 'USD'});
,这取决于已经加载的Facebook Pixel。)
现在,这是一场竞争条件。
我正在以笨重的方式处理它(通过在我的page-specific.js
中添加4秒超时,以便GTM中的Facebook Pixel有可能在那时完成加载。
要明确:我已经知道如何在 GTM中设置多个标签以等待加载GTM标签,但这不是我在这里要做的事情(因为我的{{1不在GTM内部。)
我到处搜索the documentation和教程,我从来没有找到任何描述如何管理这种依赖的人。
感谢您的建议。
答案 0 :(得分:2)
我使用"清理标记"解决了这个问题。在我的示例中,代码用于Hotjar,有问题的函数称为hj()
。
更新 :在与Hotjar支持人员联系后,我了解到Hotjar的以下代码行已足够: window.hj=window.hj||function(){(hj.q=hj.q||[]).push(arguments)};
。此处不需要清理标记,但如下所述的清理标记提供了更通用的解决方案。
在您的网站上运行此代码:
window.hjWrapperQueue = window.hjWrapperQueue || [];
function hjWrapper() {
hjWrapperQueue.push(arguments);
}
而不是拨打hj()
,而是拨打hjWrapper()
。
然后,在Google跟踪代码管理器(GTM)中,使用以下代码将清除标记添加到相关代码(下面的说明):
<script>
// Re-define the wrapper function to simply call hj()
function hjWrapper() {
hj.apply(arguments);
}
// Call all the queued events
if (window.hjWrapperQueue) {
window.hjWrapperQueue.forEach(function (hjArguments) {
hj.apply(hjArguments);
});
}
</script>
答案 1 :(得分:1)
实现此类目标的唯一方法是标记在完成加载后是否可以执行回调。此时,您可以将自定义事件推送到触发其他标记的数据层,也可以使用tag sequencing并调用
google_tag_manager[{{Container ID}}].onHtmlSuccess({{HTML ID}});
在成功回调中(必须在内置变量中启用相应的变量)并在序列标记中启用“不要触发安装标记失败”(然后它将等待成功消息)。
但大多数情况下,我猜运气不好。