Estamos usando Angular para nuestro sitio web. Como no todas las páginas se han portado a Angular, implementamos un enfoque híbrido:
ngOnInit() { this.railsService.fetchRailsPage(this.router.url).subscribe( (response) => this.replaceDOM(response), (errorResponse) => this.replaceDOM(errorResponse.error) ); } private replaceDOM(newContent: string) { document.open(); document.write(newContent); document.close(); }Dado que todos los a-hrefs en las páginas antiguas son simples hrefs antiguos (no los enlaces de enrutador de Angular), una vez que el usuario se aleja, la página se vuelve a cargar y Angular se activa nuevamente.
Hasta ahora, funciona, pero noté que a veces el DOM no se reemplaza con el cuerpo de la respuesta.
La depuración nos llevó a la conclusión de que Google Tag Manager podría ser el problema. Sobrescribe document.write() y muchas otras funciones predeterminadas de Javascript.
¿Porqué es eso? ¿Y cómo se puede evitar esto para obtener la versión predeterminada de, por ejemplo document.write() ?
Apoyando a Alan aquí.
Por favor, asegúrese de que está ejecutando dos pruebas:
Bloquee gtm con la función de bloqueo de solicitudes de las herramientas de desarrollo e intente reproducir el problema.
Intente crear un contenedor GTM vacío, cárguelo en la página y reproduzca el problema.
Si la primera prueba muestra que el problema persiste con GTM bloqueado, entonces no es GTM.
Si la segunda prueba muestra que el problema está resuelto, entonces no se trata de GTM sino de la lógica utilizada en su configuración.
En todo caso, primero me aseguraría de que ningún código personalizado en GTM anule adicionalmente document.write (que nunca antes había visto, pero definitivamente es posible). Luego, auditaría ampliamente todos los scripts personalizados implementados por GTM. Después de eso, intentaría pausar todos los activadores de visibilidad de elementos si se implementa alguno y ver si eso ayuda.
Es probable que GTM tenga como objetivo anular la escritura para poder ver los cambios de DOM. Pero lo hace suavemente, agregando un poco de seguimiento allí y sin cambiar su esencia. Es muy poco probable que la lógica central de GTM entre en conflicto con Angular.
//UPD acaba de conversar con un colega en Measure. Parece que el único escenario en el que GTM anula document.write es cuando hay etiquetas HTML personalizadas que tienen una opción para "soportar document.write". El disparador de visibilidad de elementos utiliza observadores de mutaciones e intersecciones en lugar de escuchar document.writes.