检查是否已加载analytics.js。

5
我必须使用我从服务器提供的本地analytics.js。我只想在必要时使用本地版本-因此,是否有解决方案来检查对analytics.js的调用是否失败?
我考虑使用全局window.onerror进行检查,但我不认为外部文件的调用失败会引起错误。我已经尝试检查ga()是否可用,但即使未加载analytics.js,它也是可用的。
有什么想法吗?如果你想知道,这个网站的不是所有用户都有互联网访问权限,这就是为什么我提供了一个本地版本。在这种情况下还发生了更多的事情,比如添加一个sendHitTask将analytics.js的答案重定向到本地服务器。
编辑:检查用户是否具有互联网访问权限的解决方案也可以。但我也没有找到任何适用于所有现代浏览器的解决方案。

当analytics.js没有加载时,console.log(window.ga)会打印什么? - Steven Wexler
可能未定义,就像yahoo.com一样。 - Huangism
@Huangism 我也是这么想的,但OP声称即使未加载analytics.js,它仍然存在。你在项目中是否定义了ga? - Steven Wexler
1
无论哪种情况下都不会未定义。ga()在GA片段中被定义,然后ga()加载analytics.js。 - Tony Gustafsson
1
ga对象是在包含在页面中的引导代码中设置的。即使未加载analytics.js文件(这也是它存在的意义,它存储交互直到可以处理它们),它仍然存在。因此测试这个不会有帮助。 - Eike Pierstorff
3个回答

9

有一个跟踪库是否已加载的函数。来自文档

ga(function(tracker) {
   var defaultPage = tracker.get('page');
});

传入的函数在库加载时执行,因此您可以设置一个变量来跟踪它是否已加载。您需要将其放置在某种计时器上,以决定何时认为它失败:
var loaded = false;
ga(function() {
   loaded = true;
});

// after one second do something if the library hasn't loaded
setTimeout(function(){
    if (!loaded){
        //do something
    }
},1000);

太棒了!我明天会试一下,然后告诉你它是否有效! - Tony Gustafsson
运作良好!首先我使用常规片段,运行 ga('create') 并要求显示功能和电子商务。然后我运行此函数将 gaIsLoaded 设置为 true(还设置了 sendHitTask),然后运行 ga('send')。如果我理解正确,所有这些都会被排队... 当我的常规片段失败时,它将在一秒钟后加载本地片段并运行所有先前的命令。 - Tony Gustafsson
当我将跟踪器重命名为其他名称时,有时回调函数会将跟踪器检索为未定义。你知道为什么会发生这种情况吗? - Alfredo Esteban Hernndez Dvalo
当没有默认跟踪器时,回调函数中始终会包含未定义的内容。这仍然意味着库已加载,因此此代码仍将正常工作,并且您仍然可以通过名称访问自定义跟踪器,在该回调函数中执行操作即可。 - maembe
嗨@maembe,感谢您的回答,但我也尝试使用方法ga.getAll()获取自定义跟踪器,但它也未定义,因此我认为该方法在库仍在加载时执行,我已经为此打开了一个工单。您能否看一下?https://stackoverflow.com/questions/61530268/analytics-js-callback-executed-before-library-is-loaded - Alfredo Esteban Hernndez Dvalo

6

不必等待回调,您可以使用以下方法轻松获得它:

if(window.ga && ga.loaded) {
    // yeps... it is loaded!
}

你可以在Firefox文档中轻松看到这一点。
如果您想查看是否已阻止跟踪器(例如通过任何插件),可以采用同样的技巧。
if(window.ga && ga.q) {
    // yeps... blocked! >:o
}

1
一个特别优雅的解决方案是使用RequireJS并利用它对回退路径的支持。我在我的网站上这样做,如果访问者使用阻止请求的隐私工具导致GA加载失败,就会加载analytics.js的存根版本。

http://veithen.github.io/2015/02/14/requirejs-google-analytics.html

您的用例类似,但您希望回退到完整的本地副本。您可能也不想像那篇文章中描述的那样更改对GA的所有调用。如果是这种情况,那么您可以使用混合方法,只使用RequireJS来加载analytics.js(Google版本或本地副本),而不更改任何其他代码。
设置这个需要以下步骤:
  • Add RequireJS to your site and configure it as follows:

    require.config({
        paths: {
            "ga": [
                "//www.google-analytics.com/analytics",
                "local-copy-of-analytics"
            ]
        }
    });
    
  • Use the alternative version of the tracking code, but replace <script async src='//www.google-analytics.com/analytics.js'></script> with the following JavaScript code:

    require(["ga"]);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接