2015-03-26 3 views
4

Je dois utiliser un analytics.js local que je sers de mon serveur. Je veux juste utiliser la version locale si nécessaire - alors existe-t-il une solution pour vérifier si l'appel de analytics.js a échoué?Vérifie si analytics.js est chargé

J'ai pensé à le vérifier avec un window.onerror global, mais je ne pense pas qu'un appel échoué pour un fichier externe provoque une erreur. J'ai essayé de vérifier si ga() est disponible, mais c'est même si analytics.js n'est pas chargé.

Des idées? Si vous vous posez la question, tous les utilisateurs de ce site n'ont pas accès à Internet, c'est pourquoi je diffuse une version locale. Il y a plus de choses qui se passent dans ce cas, comme l'ajout d'un sendHitTask pour rediriger la réponse de analytics.js vers le serveur local.

EDIT Une solution permettant de vérifier si l'utilisateur dispose d'un accès Internet serait également OK. Mais je n'ai trouvé aucune solution pour cela qui fonctionne sur tous les navigateurs modernes.

+0

Que consomme console.log (window.ga) lorsque analytics.js n'est pas chargé? –

+0

Probablement indéfini, comme yahoo.com – Huangism

+0

@Huangism c'est ce que je pense aussi, mais OP prétend qu'il existe même lorsque analytics.js n'a pas chargé. Définissez-vous ga ailleurs dans votre projet? –

Répondre

7

Il existe une fonction permettant de suivre si la bibliothèque est chargée. De la documentation https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference#ready-callback:

ga(function(tracker) { 
    var defaultPage = tracker.get('page'); 
}); 

Le passé en fonction est exécutée lorsque la bibliothèque est chargée, de sorte que vous pouvez définir une variable pour garder la trace de si oui ou non il a été chargé. Il faudrait le mettre sur une sorte de minuterie pour décider quand vous voulez le considérer a échoué:

var loaded = false; 
ga(function() { 
    loaded = true; 
}); 

// after one second do something if the library hasn't loaded 
setTimeout(function(){ 
    if (!loaded){ 
     //do something 
    } 
},1000); 
+0

Génial! Je vais essayer cela demain et vous faire savoir si cela fonctionne! –

+0

Fonctionne bien! D'abord, j'utilise l'extrait normal, lance un ga ('create') et exige displayfeature et e-commerce. J'exécute cette fonction pour mettre gaIsLoaded à true (et aussi pour définir une sendHitTask), puis je lance ga ('send'). Tout ceci est mis en file d'attente si je comprends bien ... et quand mon extrait normal échoue, il chargera un fichier local une seconde plus tard, et exécutera toutes les commandes précédentes. –

0

Une solution particulièrement élégante serait d'utiliser RequireJS et tirer parti de son soutien à fallback paths. Je le fais sur mon site pour charger une version bouchonnée de analytics.js si le chargement GA échoue parce que le visiteur utilise un outil de confidentialité bloquant la demande:

http://veithen.github.io/2015/02/14/requirejs-google-analytics.html

Votre cas d'utilisation est similaire, sauf que vous voulez fallback à une copie locale complète. Vous aussi probablement ne voulez pas changer tous les appels à GA comme décrit dans cet article. Si c'est le cas, vous pouvez utiliser une approche hybride où vous utilisez seulement RequireJS pour charger analytics.js (la version de Google ou la copie locale), sans changer aucun autre code.

La définition de cette place impliquerait les étapes suivantes:

  • Ajouter RequireJS sur votre site et le configurer comme suit:

    require.config({ 
        paths: { 
         "ga": [ 
          "//www.google-analytics.com/analytics", 
          "local-copy-of-analytics" 
         ] 
        } 
    }); 
    
  • Utilisez le alternative version of the tracking code, mais remplacez <script async src='//www.google-analytics.com/analytics.js'></script> avec le code JavaScript suivant code:

    require(["ga"]);