Edu*_*rdo 47 javascript design-patterns google-analytics
Google Analytics异步代码使用非常独特的设计模式来执行javascript代码.
代码依赖于库,并且不知道库是否已加载.如果库尚未加载,则只将所有命令排队到Array对象中.当库加载它时,它只是创建_gaq对象并按照它包含的顺序执行所有命令.然后它会覆盖推送功能,以便立即执行将来的命令.
这个想法是让命令在排队时运行得非常快.只有在加载库时才会对代码进行真正的评估.
他们还使用参数加载库async=true.这对实际页面加载时间几乎没有影响.
命令看起来就像它的同步版本,但第一个字符串是函数名称,接下来的参数是函数参数.您还可以将函数推送到此数组中,函数也将按顺序执行,并使用空上下文.因此,如果您需要与库同步,可以在_gaq中推送一个函数来执行此操作.
我认为这是一个非常聪明的解决方案,但我以前从未见过它.除了Google Analytics跟踪代码之外,有没有人知道此设计模式的名称或其使用位置?
Yah*_*hel 45
我把它称为"异步函数排队",但它不是一个吸引人的名字,当然也不是设计模式的正式名称.
有趣的是,尽管我之前没有看到过这种特殊模式,但是谷歌将其用于谷歌分析,它被不同的平台广泛采用,希望能够获得异步果汁(想到这一点).
这篇博文是对我所阅读的异步Google Analytics语法的最深入研究,并包含了一个如何复制模式的相当详细的解释:
来自博文:
var GoogleAnalyticsQueue = function () {
this.push = function () {
for (var i = 0; i < arguments.length; i++) try {
if (typeof arguments[i] === "function") arguments[i]();
else {
// get tracker function from arguments[i][0]
// get tracker function arguments from arguments[i].slice(1)
// call it! trackers[arguments[i][0]].apply(trackers, arguments[i].slice(1));
}
} catch (e) {}
}
// more code here…
};
// get the existing _gaq array
var _old_gaq = window._gaq;
// create a new _gaq object
window._gaq = new GoogleAnalyticsQueue();
// execute all of the queued up events - apply() turns the array entries into individual arguments
window._gaq.push.apply(window._gaq, _old_gaq);
Run Code Online (Sandbox Code Playgroud)
它还指出,即使没有多少浏览器支持该async属性,使用的注入方法也会使脚本在大多数浏览器中异步加载,并包含一个有用的图表:
