This repository has been archived by the owner on Oct 9, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 32
/
jquery.google-analytics.js
260 lines (237 loc) · 8.8 KB
/
jquery.google-analytics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
* jquery-google-analytics plugin
*
* A jQuery plugin that makes it easier to implement Google Analytics tracking,
* including event and link tracking.
*
* Adds the following methods to jQuery:
* - $.trackPage() - Adds Google Analytics tracking on the page from which
* it's called.
* - $.trackPageview() - Tracks a pageview using the given uri. Can be used for tracking Ajax requests: http://www.google.com/support/analytics/bin/answer.py?hl=en&answer=55519
* - $.trackEvent() - Tracks an event using the given parameters.
* - $('a').track() - Adds event tracking to element(s).
* - $.timePageLoad() - Measures the time it takes an event using the given parameters.
*
* Features:
* - Improves page load time by loading Google Analytics code without blocking.
* - Easy and extensible event and link tracking plugin for jQuery and Google Analytics
* - Automatic internal/external link detection. Default behavior is to skip
* tracking of internal links.
* - Enforces that tracking event handler is added to an element only once.
* - Configurable: custom event tracking, skip internal links, metadata
* extraction using callbacks.
*
* Copyright (c) 2008-09 Christian Hellsten
*
* Plugin homepage:
* http://aktagon.com/projects/jquery/google-analytics/
* http://github.com/christianhellsten/jquery-google-analytics/
*
* Examples:
* http://aktagon.com/projects/jquery/google-analytics/examples/
* http://code.google.com/apis/analytics/docs/eventTrackerGuide.html
*
* Repository:
* git://github.com/christianhellsten/jquery-google-analytics.git
*
* Version 1.1.3
*
* Tested with:
* - Mac: Firefox 3, Safari 3
* - Linux: Firefox 3
* - Windows: Firefox 3, Internet Explorer 6
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
* Credits:
* - http://google.com/analytics
* - http://lyncd.com:
* Idea for trackPage method came from this blog post: http://lyncd.com/2009/03/better-google-analytics-javascript/
*/
(function($) {
var pageTracker;
/**
* Enables Google Analytics tracking on the page from which it's called.
*
* Usage:
* <script type="text/javascript">
* $.trackPage('UA-xxx-xxx', options);
* </script>
*
* Parameters:
* account_id - Your Google Analytics account ID.
* options - An object containing one or more optional parameters:
* - onload - boolean - If false, the Google Analytics code is loaded
* when this method is called instead of on window.onload.
* - status_code - The HTTP status code of the current server response.
* If this is set to something other than 200 then the page is tracked
* as an error page. For more details: http://www.google.com/support/analytics/bin/answer.py?hl=en&answer=86927
* - callback - function to be executed after the Google Analytics code is laoded and initialized
*
*/
$.trackPage = function(account_id, options) {
var host = (("https:" === document.location.protocol) ? "https://ssl." : "http://www.");
var script;
// Use default options, if necessary
var settings = $.extend({}, {onload: true, status_code: 200}, options);
var src = host + 'google-analytics.com/ga.js';
function init_analytics() {
if (typeof _gat !== undefined) {
debug('Google Analytics loaded');
pageTracker = _gat._getTracker(account_id);
if(settings.status_code === null || settings.status_code === 200) {
pageTracker._trackPageview();
} else {
debug('Tracking error ' + settings.status_code);
pageTracker._trackPageview("/" + settings.status_code + ".html?page=" + document.location.pathname + document.location.search + "&from=" + document.referrer);
}
if($.isFunction(settings.callback)){
settings.callback(pageTracker);
}
}
else {
throw "_gat is undefined"; // setInterval loading?
}
}
load_script = function() {
$.ajax({
type: "GET",
url: src,
success: function() {
init_analytics();
},
dataType: "script",
cache: true // We want the cached version
});
};
// Enable tracking when called or on page load?
if(settings.onload === true || settings.onload === null) {
$(window).load(load_script);
} else {
load_script();
}
};
/**
* Tracks an event using the given parameters.
*
* The trackEvent method takes four arguments:
*
* category - required string used to group events
* action - required string used to define event type, eg. click, download
* label - optional label to attach to event, eg. buy
* value - optional numerical value to attach to event, eg. price
* skip_internal - optional boolean value. If true then internal links are not tracked.
*
*/
$.trackEvent = function(category, action, label, value) {
if(typeof pageTracker === 'undefined') {
debug('FATAL: pageTracker is not defined'); // blocked by whatever
} else {
pageTracker._trackEvent(category, action, label, value);
}
};
/**
* Tracks socialnetworks using the given parameters.
*
* The trackSocial method takes four arguments:
*
* network - name of the network, e.g. facebook, tweeter
* socialAction - action, e.g. like/unlike
* opt_target - Optional: A string representing the URL (or resource) which receives the action.
* opt_pagePath - Optional: A string representing the page by path (including parameters) from which the action occurred.
*
*/
$.trackSocial = function(network, socialAction, opt_target, opt_pagePath) {
if(typeof pageTracker == 'undefined') {
debug('FATAL: pageTracker is not defined'); // blocked by whatever
} else {
pageTracker._trackSocial(network, socialAction, opt_target, opt_pagePath);
}
};
/**
* Tracks a pageview using the given uri.
*
*/
$.trackPageview = function(uri) {
if(typeof pageTracker === 'undefined') {
debug('FATAL: pageTracker is not defined');
} else {
pageTracker._trackPageview(uri);
}
};
/**
* Adds click tracking to elements. Usage:
*
* $('a').track()
*
*/
$.fn.track = function(options) {
/**
* Checks whether a setting value is a string or a function.
*
* If second parameter is a string: returns the value of the second parameter.
* If the second parameter is a function: passes the element to the function and returns function's return value.
*/
function evaluate(element, text_or_function) {
if(typeof text_or_function === 'function') {
text_or_function = text_or_function(element);
}
return text_or_function;
}
// Add event handler to all matching elements
return this.each(function() {
var element = $(this);
// Prevent an element from being tracked multiple times.
if (element.hasClass('tracked')) {
return false;
} else {
element.addClass('tracked');
}
// Use default options, if necessary
var settings = $.extend({}, $.fn.track.defaults, options);
// Merge custom options with defaults.
var category = evaluate(element, settings.category);
var action = evaluate(element, settings.action);
var label = evaluate(element, settings.label);
var value = evaluate(element, settings.value);
var event_name = evaluate(element, settings.event_name);
var message = "category:'" + category + "' action:'" + action + "' label:'" + label + "' value:'" + value + "'";
debug('Tracking ' + event_name + ' ' + message);
// Bind the event to this element.
// TODO Use .live since jQuery 1.4 now supports it better.
element.bind(event_name + '.track', function() {
// Should we skip internal links? REFACTOR
var skip = settings.skip_internal && (element[0].hostname === location.hostname);
if(!skip) {
$.trackEvent(category, action, label, value);
debug('Tracked ' + message);
} else {
debug('Skipped ' + message);
}
return true;
});
});
};
/**
* Prints to Firebug console, if available. To enable:
* $.fn.track.defaults.debug = true;
*/
function debug(message) {
if ($.fn.track.defaults.debug && typeof console !== 'undefined' && typeof console.debug !== 'undefined') {
console.debug(message);
}
}
/**
* Default (overridable) settings.
*/
$.fn.track.defaults = {
category : function(element) { return (element[0].hostname === location.hostname) ? 'internal':'external'; },
action : 'click',
label : function(element) { return element.attr('href'); },
value : null,
skip_internal : true,
event_name : 'click',
debug : false
};
}(jQuery));