通过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');
}
}
它可以工作,还可以记录多个include的潜在错误。然后我想了一些更聪明的方法,通过检查_gaq
堆栈的对象原型:
with (window) {
if (_gaq instanceof Array) {
// not loaded, so include it...
} else {
// it's been included
}
}
当_gaq
对象仍然未被ga.js
库初始化时,它是一个简单的数组,因此第一个条件为true。初始化时,它将被覆盖为对象,不再是Array基元对象的实例。
缺点
我想知道window.onload
的史诗般的问题:将解决方案实现为同步代码(在它所在的位置进行评估),如果ga.js
库已经包含但由于异步调用而尚未加载到DOM中,那么它无论如何都会导致双重包含。因此,应该触发DOMContentLoaded
事件来调用while中的两个解决方案之一。
我在网上搜索了关于这个主题的类似问题,但官方GA文档缺乏关于它的信息,流行资源上的结果似乎都没有处理它
我向我提出的另一个问题是,双重包含是否是一个问题:从纯粹的技术角度来看,我认为谷歌分析可以预测并管理这种用户错误,就像在某些情况下一样(有人知道是不是这样吗?)。但从用户的角度来看,第二个无用的HTTP请求的时间是令人讨厌的,希望可以避免。
有人面对这个问题或有什么建议吗?
试着对ga.js中定义的_gat对象进行类型检查。至于这一切的时间和双重包含问题,我看不出有什么功能上的原因不能包含两次。这是额外的开销,但ga.js所做的只是提供一些可调用的函数。
尝试使用双重include,看看GA Debug工具是否有什么要说的:https://chrome.google.com/webstore/detail/jnkmfdileelhofjcijamephohjechhna