我有一个页面在加载时触发ajax调用
$(window).load(function() {
updateDeliverySlots();
});
我的身体顶部还有Google Tag Manager javascript(我知道目前的建议是将其放在head部分,但我们还没有更新代码,并且不认为这是问题的根源)。
<body>
<!-- Google Tag Manager -->
<noscript>
<iframe src="//www.googletagmanager.com/ns.html?id=XXXX" height="0" width="0" style="display:none;visibility:hidden">
</iframe>
</noscript>
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});
var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
j.async=true;
j.src='//www.googletagmanager.com/gtm.jsid='+i+dl;f.parentNode.insertBefore(j,f);
})
(window,document,'script','dataLayer','XXXX');
</script>
<!-- End Google Tag Manager -->
....
</body>
我对GTM标记中包含的脚本进行的调用之一有疑问。该脚本向第三方发送请求。如果请求因任何原因无法连接(例如服务器关闭),则在请求超时(60秒)之前,我的updateDeliverySlots()函数(以及其中的ajax调用)不会被触发。我还发现页面仍在“加载”(根据浏览器图标)。
我的GTM实现中有什么东西我做错了吗?我的理解是,Google Tags后面的所有内容都应该是异步的,并且与页面的“准备就绪”无关。
当处理到达时,必须获取并运行同步脚本,async scripts可以在处理到达它们之后的任何时间运行。
因此,根据服务器/页面控件之外的时间,异步脚本可以:
您可以在GTM中选择以下几个选项之一来解决此问题:
page view -> window loaded
即:
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXX');</script>
<!-- End Google Tag Manager -->
由于这会将整个GTM流程移至页面完全解析后,因此会破坏“Google Optimizer”标记和早期页面跟踪。
我有同样的问题,GTM确实推迟了其他脚本的执行。使用jquery $(window).load加载它的一个小改动解决了这个问题:
<script>function loadgtm(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
};$(window).load(function(){loadgtm(window,document,'script','dataLayer','GTMID');});</script>