Tengo un sitio web HTML básico (con algo de javascript) usando una etiqueta de anclaje simple para descargar un archivo como este:
<a href="../resources/mexml/MexmlSamples-1.0.zip">Mexml Samples 1.0</a>
Para rastrear el número de descargas, tengo un controlador onclick
que pasa un evento a Google Analytics así:
$('#mybutton').click(function(e){ga('send','event','Download','MexmlSample','MexmlSample-1.0');});
Esto funciona como se esperaba al descargar el archivo usando Chrome en OS X e IE en Windows 7. El archivo se descarga y veo el evento en mi cuenta de GA.
Cuando lo pruebo en Safari 8 en Yosemite, el archivo se descarga, pero GA rara vez ve el evento. Y, por supuesto, aparece el temido Failed to load resource: Frame load interrupted
en la consola de errores de Safari.
Supongo que a veces obtengo el evento GA debido a una condición de carrera entre el momento en que Safari interrumpe la acción y el momento en que se activa el código GA.
Entonces, ¿se puede hacer algo para solucionar esto en Safari para que siempre obtenga los eventos de GA?
Tenga en cuenta que mi pregunta probablemente tenga la misma causa raíz que esta pregunta sin respuesta: la carga del marco se interrumpió al descargar archivos de Excel
Actualización 6 de junio
Ahora estoy completamente confundido. Acabo de darme cuenta de que si abro una nueva página del navegador en mi sitio (en Safari) y hago clic en la descarga, GA lo registra. Sin embargo, los clics posteriores descargan el archivo, pero GA no lo registra.
Si cierro esa ventana y abro una nueva, GA registra nuevamente la primera descarga.
Por el contrario, cuando se usa Chrome, GA registra todas las descargas.
Ahora estoy pensando que puedo estar viendo el problema equivocado. El comportamiento que veo me dice que Safari mantiene un estado en JavaScript que permite que se realice la primera llamada de GA, pero bloquea todas las llamadas posteriores.
Pero este es el mismo código que ejecuta Chrome, por lo que no sé cómo comenzar a depurar el problema.
Si siempre desea obtener el evento ga, es probable que hitCallback sea la única forma de hacerlo hasta que se solucione el problema con Safari. Utilizo un patrón similar para enviar un evento GA desde una página en una aplicación que es solo una redirección después de que se haya ejecutado una gran cantidad de elementos de la base de datos en Rails. No hay un retraso notable al agregar la redirección de JavaScript en la devolución de llamada. Sin embargo, no estoy seguro de cómo iniciar la descarga desde JavaScript desde la parte superior de mi cabeza.
ga('send','event','Download','MexmlSample','MexmlSample-1.0', { hitCallback: function(){ initiateDownload(); })
No tengo conocimiento de ninguna necesidad de usar setTimeout() para el patrón en este caso.
La única solución en la que puedo pensar es esperar hasta que finalice la solicitud de GA, y solo después de eso, configure location.href en el enlace de descarga del archivo deseado. Pero esto no es realmente bueno desde la perspectiva del usuario. (Esto se puede lograr con la devolución de llamada https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#hitCallback ).
Probablemente el atributo de descarga de HTML5 para href resolverá el problema. No tengo OSX con safari para probar, así que esto es solo mi opinión.