OSX Safari帧加载中断

时间:2015-05-26 12:47:48

标签: javascript safari osx-yosemite

我有一个基本的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');});

在使用操作系统X上的Chrome和Windows 7上的IE下载文件时,这可以正常工作。文件会下载,我会在GA帐户中看到该事件。

当我在优胜美地的Safari 8中测试时,文件下载,但GA很少看到该事件。当然,我在Safari错误控制台中遇到了可怕的Failed to load resource: Frame load interrupted

我认为我有时会因为Safari中断动作和GA代码触发之间的竞争条件而得到GA事件。

在Safari中可以做任何事情来解决这个问题,以便我总能得到GA事件吗?

请注意,我的问题可能与此未答复问题具有相同的根本原因:Frame load interrupted when downloading excel files

6月6日更新

我现在彻底困惑了。我刚刚注意到,如果我打开一个新的浏览器页面到我的网站(在Safari中),然后点击下载,那么它会被GA记录下来。但是,后续点击仍会下载文件,但不会被GA记录。

如果我关闭该窗口并打开一个新窗口,则GA会再次记录第一次下载。

相比之下,使用Chrome时,每次下载都会被GA记录下来。

我现在想我可能正在看错了问题。我看到的行为告诉我Safari正在使用JavaScript保持一个状态,允许第一个GA调用通过,但阻止所有后续调用。

但这与Chrome运行的代码相同,所以我不知道如何开始调试问题。

2 个答案:

答案 0 :(得分:0)

如果你总是想要获得ga事件,那么hitCallback可能是唯一的方法,直到修复了Safari的任何错误。我使用类似的模式从应用程序中的页面发送GA事件,这只是在rails中执行了大量数据库内容之后的重定向。将javascript重定向添加到回调中没有明显的延迟。但是我不知道如何从javascript开始下载。

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

我不知道在这个例子中是否需要使用setTimeout()作为模式。

答案 1 :(得分:-1)

我能想到的唯一解决方案 - 等待GA请求完成,并且只有在设置location.href之后才能完成所需的文件下载链接。但从用户的角度来看,这并不是很好。 (这可以通过命中回调https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#hitCallback)来实现。

href的HTML5下载属性可能会解决问题。 我没有测试OSX的OSX,所以这只是我的想法。