0

使用 Google Analytics 实施自定义解决方案以跟踪页面、事件和其他内容,我想检查该ga.js库是否已被包含以避免双重包含,因为我在一个有多个利益相关者的环境中工作,这些利益相关者也使用 Google Analytics,并且重叠是一种可能。

起初,我想循环所有当前脚本,寻找src属性:

// load the Google Analytics library only if it has not been already loaded:
var gaScripts = 0; // number of ga.js scripts in the current document
var scripts = document.getElementsByTagName('script');

for (var i in scripts) {
    // go through all the scripts:
    if (typeof(scripts[i].src) !== 'undefined' && scripts[i].src.split('?')[0].match(/ga\.js$/)) {
        // update the counter if ga.js has been found:
        gaScripts++;
    }
}

if (gaScripts === 0) {
    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();

    // update the counter:
    gaScripts++;

} else if (gaScripts > 1) {
    // the ga.js library has been loaded more than once, log this error:
    if (window.console) {
        console.log('Warning: the ga.js script has been included ' + gaScripts + ' times in the page');
    }
}

它可以工作,并且还会记录多个包含的潜在错误。_gaq然后通过检查堆栈的对象原型,我想到了一些更聪明的方法:

with (window) {
    if (_gaq instanceof Array) {
        // not loaded, so include it...
    } else {
        // it's been included
    }
}

_gaq对象还没有被ga.js库初始化时,它是一个简单的数组,所以第一个条件为真。当它被初始化时,它被覆盖为一个对象,它不再是 Array 原始对象的实例。

缺点

我想知道window.onload史诗般的问题:将解决方案实现为同步代码(在它所在的位置进行评估),如果该ga.js库已包含但尚未加载到 DOM 中,因为异步调用,它无论如何都会导致双重包含。因此,DOMContentLoaded应该触发该事件以在此期间调用两个解决方案之一。

我在网上搜索了有关此主题的类似问题,但官方 GA 文档缺乏有关它的信息,流行资源上的结果似乎都没有处理它。

我向我提出的另一个问题是双重包含是否是一个问题:从纯粹的技术角度来看,我认为 Google Analytics 可以预测这种用户错误并对其进行管理,就像在某些情况下那样(有人知道是不是这样吗? ?)。但是从用户的角度来看,第二个无用的 HTTP 请求的时间很烦人,希望可以避免。

有人遇到这个问题或有什么建议吗?

4

1 回答 1

1

尝试对 ga.js 中定义的 _gat 对象进行类型检查。至于这一切的时间安排和双重包含问题,我认为没有功能性原因不能包含两次。这是额外的开销,但 ga.js 所做的只是提供一些函数来调用。

尝试使用双重包含,看看 GA 调试工具是否有什么要说的: https ://chrome.google.com/webstore/detail/jnkmfdileelhofjcijamephohjechhna

于 2012-07-16T15:37:46.227 回答