Javascript - Обнаруживает, загружена ли Google Analytics?
Я работаю над проектом здесь, который будет хранить некоторую информацию в пользовательских переменных Google Analytics. script Мне нужно выяснить, загрузила ли GA еще до того, как я смогу подтолкнуть данные к нему. Проект разрабатывается для работы на любом сайте, который использует GA. Проблема заключается в надежном обнаружении того, закончила ли загрузка GA или нет и доступна.
Несколько вариаций здесь:
-
Существует несколько способов загрузки GA. Старые сценарии из Urchin дней до последних асинхронных скриптов. Некоторые из них встроены, некоторые из них асинхронны. Кроме того, на некоторых сайтах пользовательские методы загрузки GA, как и на моей работе. Мы используем YUI getScript для его загрузки.
-
Имена переменных переменных. В некоторых сценариях имя переменной, присвоенное GA, равно pageTracker
. В других - его _gaq
. Затем существует бесконечность имен пользовательских переменных, которые сайты могут использовать для их реализации GA.
У кого-нибудь есть мысли о том, что может быть надежным способом проверить, используется ли Google Analytics на странице, и если он был загружен?
Ответы
Ответ 1
function checkIfAnalyticsLoaded() {
if (window._gaq && window._gaq._getTracker) {
// Do tracking with new-style analytics
} else if (window.urchinTracker) {
// Do tracking with old-style analytics
} else {
// Retry. Probably want to cap the total number of times you call this.
setTimeout(500, checkIfAnalyticsLoaded());
}
}
Ответ 2
Я слишком сдержан, чтобы ответить на ответ Анни, который работает, но имеет синтаксические ошибки. Имена Analytics сначала подчеркивают, а синтаксис setTimeout() - назад (и неполным). Это должно быть так:
function checkIfAnalyticsLoaded() {
if (window._gat && window._gat._getTracker) {
// Do tracking with new-style analytics
} else if (window.urchinTracker) {
// Do tracking with old-style analytics
} else {
// Probably want to cap the total number of times you call this.
setTimeout(checkIfAnalyticsLoaded, 500);
}
}
Ответ 3
Для этого вы можете поместить код выше/до Отслеживающий код Google Analytics:
function check_ga() {
if (typeof ga === 'function') {
console.log('Loaded :'+ ga);
} else {
console.log('Not loaded');
setTimeout(check_ga,500);
}
}
check_ga();
Демо: http://jsbin.com/rijiyojume/edit?html,console
Или Если вы можете запустить script после Отслеживающий код Google Analytics:
ga(function(tracker) {
console.log(tracker.get('clientId'));
});
Демо: http://jsbin.com/wiqategifo/1/edit?html,console
Ссылка: #ready-callback
Ответ 4
Вот как я это сделал:
var ga = window[window['GoogleAnalyticsObject'] || 'ga'];
if (typeof ga == 'function') {
// call ga object here
ga('send', 'event', 'Social Share Button', 'click', 'facebook');
}
Ответ 5
Я использую это, но я создал из него вспомогательную функцию, которая позволяет мне передавать функции и аргументы, и они вызывается, когда загружается Google Analytics. Он проверяет раз в полсекунды и прекращает проверку через минуту, если Google Analytics не загрузится. Я думал, что это может быть полезно для других.
Использование:
function add(a,b){alert(a + ' + ' + b + ' = ' + (a+b));}
_mygaq(add,1,2);
код:
function _mygaq(fn) {
this._count = this._count || 0;
this._running = this._running || false;
this._q = this._q || [];
if(arguments.length>0){
this._q.push({"f":fn,"p":Array.prototype.slice.call(arguments,1)});
} else {
this._count++;
}
if ((window._gat && window._gat._getTracker) || window.urchinTracker) {
this._count = 0;
this._running = false;
while (this._q.length > 0){
var _innr = this._q[0];
this._q = this._q.slice(1);
_innr.f.apply(_innr.f, _innr.p);
}
} else {
if( (arguments.length==0) || (!this._running && arguments.length>0)){
if(this._count < 120) setTimeout('_mygaq()', 500);
this._running = true;
}
}
}
Ответ 6
Стиль ECMA2015
let checkIfAnalyticsLoaded = () => {
return new Promise((resolve, reject) => {
let timeStart = Date.now();
const TIMEOUT = 3000;
let _isLoaded = function() {
if (Date.now() - timeStart > TIMEOUT) {
reject('Timeout. Google analytics not injected!');
return;
}
if (window.ga && ga.create) {
resolve(ga);
return;
} else {
setTimeout(_isLoaded, 500);
}
};
_isLoaded();
});
}
checkIfAnalyticsLoaded()
.then((result => {
console.log('LOADED', result);
}))
.catch(console.error);
Ответ 7
вы также можете заглянуть в новое асинхронное отслеживание, и тогда вам не нужно будет проверять, что вы можете делать что угодно, и он отправит данные как только он загрузится...
Ответ 8
У меня есть другое решение для этого, если кто-то хочет попробовать это. Это предполагает, что ваш объект Google Analytics является "ga". Измените свой тайм-аут и максимальные попытки в соответствии с вашим приложением.
<script type="text/javascript">
var counter = 1;
function checkIfAnalyticsLoaded() {
if (window.ga) {
//LOADED!
} else {
counter = counter + 1;
if (counter < 6){
setTimeout('checkIfAnalyticsLoaded()', 200);
} else {
//LOADED!
}
}
}
window.onload = checkIfAnalyticsLoaded();
</script>