Прерывание кадров в Safari OSX

У меня есть базовый HTML-сайт (с некоторым javascript), используя простой тег привязки для загрузки файла следующим образом:

<a href="../resources/mexml/MexmlSamples-1.0.zip">Mexml Samples 1.0</a>

Чтобы отслеживать количество загрузок, у меня есть обработчик onclick, который передает событие в Google Analytics следующим образом:

$('#mybutton').click(function(e){ga('send','event','Download','MexmlSample','MexmlSample-1.0');});

Это работает так, как ожидалось, при загрузке файла с помощью Chrome OS X и IE в Windows 7. Загружается файл, и я вижу это событие в моей учетной записи GA.

Когда я тестирую его в Safari 8 на Yosemite, файл загружается, но GA редко видит событие. И, конечно, я получаю страшный Failed to load resource: Frame load interrupted в консоли ошибок Safari.

Я предполагаю, что иногда получаю событие GA из-за состояния гонки между тем, когда Safari прерывает действие и когда запускается код GA.

Итак, можно ли все-таки исправить это в Safari, чтобы всегда получать события GA?

Обратите внимание, что мой вопрос, вероятно, имеет ту же самую основную причину, что и этот без ответа вопрос: Загрузка кадра прерывается при загрузке файлов excel

Обновление 6 июня

Теперь я совершенно смущен. Я просто заметил, что если я открою новую страницу браузера на моем сайте (в Safari) и нажимаю на загрузку, то она будет занесена в журнал GA. Однако последующие клики загружают еще файл, но не регистрируются GA.

Если я закрою это окно и открою новый, то снова первая загрузка будет записана GA.

В отличие от этого, при использовании Chrome каждая загрузка регистрируется GA.

Теперь я думаю, что, возможно, я искал неправильную проблему. Поведение, которое я вижу, говорит мне, что Safari поддерживает состояние в JavaScript, которое позволяет выполнить первый вызов GA, но блокирует все последующие вызовы.

Но это тот же код, который запускается в Chrome, поэтому я не знаю, как начать отладку проблемы.

Ответы

Ответ 1

Если вы всегда хотите получить событие ga, то hitCallback, скорее всего, будет единственным способом, до тех пор, пока не будет исправлено неправильное использование Safari. Я использую подобный шаблон для отправки события GA со страницы в приложении, которая является просто перенаправлением после того, как в rails был запущен весь загруженный материал базы данных. Нет заметного отставания от добавления javascript-перенаправления в обратный вызов. Однако я не уверен, как начать загрузку с javascript с верхней части моей головы.

ga('send','event','Download','MexmlSample','MexmlSample-1.0', {
   hitCallback: function(){
   initiateDownload();
   })

Мне не известно о необходимости использования setTimeout() для шаблона в этом экземпляре.

Ответ 2

Единственное решение, о котором я могу думать, - до тех пор, пока запрос GA не завершится, и только после этого установите location.href на нужную ссылку для загрузки файла. Но это не очень хорошо с точки зрения пользователя. (Это может быть достигнуто с помощью callbackback https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#hitCallback).

Вероятно, атрибут загрузки HTML5 для href решит проблему. У меня нет OSX с сафари для тестирования, так что это только мои мысли.