Tengo una página que dispara una llamada ajax al cargar
$(window).load(function() { updateDeliverySlots(); });También tengo javascript de Google Tag Manager en la parte superior de mi cuerpo (sé que la sugerencia actual es colocar esto en la sección principal , pero aún no hemos actualizado el código y no creo que esa sea la fuente del problema) ).
<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>Tengo un problema con una de las llamadas que hace un script incluido en una etiqueta GTM. Este script envía una solicitud a un tercero. Si la solicitud no se puede conectar por cualquier motivo (p. ej., el servidor está inactivo), mi función updateDeliverySlots() (y la llamada ajax en ella) no se activa hasta que se agota el tiempo de espera de la solicitud (60 segundos). También encuentro que la página todavía está 'cargando' (según los íconos del navegador).
¿Hay algo en mi implementación de GTM que estoy haciendo mal? Entendí que todo lo que se dispara en la parte posterior de las etiquetas de Google debería ser asíncrono y no tendría relación con la "preparación" de la página.
Los scripts sincrónicos deben recuperarse y ejecutarse cuando el procesamiento los alcance, los scripts asíncronos pueden ejecutarse en cualquier momento después de que el procesamiento los alcance.
Dependiendo del tiempo que esté fuera del control del servidor/páginas, un script asíncrono puede, por lo tanto:
Puede elegir una de varias opciones para resolver esto en GTM:
page view -> window loadedBloquear scripts personalizados en GTM (lo que también evitará el seguimiento relacionado)
Cambie async para diferir en su fragmento de GTM.
Es decir:
<!-- 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 -->Dado que esto mueve todo el proceso GTM después de que la página se analiza por completo, romperá las etiquetas "Google Optimizer" y el seguimiento de la página inicial.
Tuve el mismo problema y GTM realmente estaba retrasando la ejecución de otros scripts. Un pequeño cambio para cargarlo con jquery $(window).load resolvió el problema:
<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>