2010-09-01 3 views
4

Lors de l'utilisationutilisant _gaq asynch dans les fermetures

var _gaq = _gaq || []; 

dans une balise de script ce qui serait nécessaire pour soutenir ce dans une fermeture d'ajouter l'analyse des demandes async.

à savoir

experiment = (function(){ 
      var _gaq = _gaq || []; 
      _gaq.push(['_setAccount', 'UA-XXXXX-X']); 
      _gaq.push(['_trackPageview']); 
      var nobody_knows_this_var_is_here = "cant see me"; 
     }); 

si _gaq est pas déjà défini qu'il pourra trouver ce tableau pour effectuer les articles poussés sur elle une fois qu'il est prêt. puisque le _gaq var n'est pas public, je suppose que ça ne marchera pas. Des solutions de contournement?

Répondre

5

Vous pouvez faire quelque chose comme:

(function (window) { 
    var g = window._gaq || (window._gaq = []); 
    g.push(['_setAccount', 'UA-XXXXX-X']); 
    g.push(['_trackPageview']); 
})(this); 

Si elle est exécutée dans la portée globale de cette ferait l'affaire.

+0

A l'intérieur de la fonction 'window' sera' undefined', cela provoquera une exception 'TypeError' quand on accédera à la propriété' window._gaq'. Le premier argument de 'call' est utilisé comme valeur' this' dans la fonction invoquée, l'argument 'window' n'est pas fourni. – CMS

+0

Il vaut mieux laisser la fonction sans arguments puisque la variable 'window' est déjà liée à ce que vous voulez, bien que plus haut dans la chaîne de portée. –

+0

CMS: Vous avez totalement raison, et je sais ce que «appel» fait; juste un blurp mentale. Daniel: principalement, je le passe pour que vous puissiez l'utiliser avec des environnements non hébergés par navigateur. Bien sûr, je ne sais pas pourquoi vous essayez de suivre les pages vues dans un environnement non hébergé par un navigateur, mais c'est une bonne habitude de ne pas supposer que l'objet global est 'window'. –

1

Cela fonctionne (en utilisant la notation de jQuery pour document.ready):

$(function() { 
    $('.foobar').on('click', function() { 
     var _gaq = window._gaq || (window._gaq = []); 
     _gaq.push(['_trackEvent', 'category', 'action', 'label']); 
    }); 
}); 
0

Je ne sais pas si cela va aider les autres à la recherche d'une réponse, mais peut-être il le fera. J'ai eu un problème avec _gaq n'étant pas défini. J'ai réalisé que mon extrait GA était proche de la fin de la page juste avant la balise de fin de corps. Je l'ai déplacé juste après le début de l'étiquette de corps, comme Google suggère maintenant. J'ai toujours eu ce problème d'un _gaq indéfini. Mettre

var _gaq = window._gaq || (window._gaq = []);

au sommet de mon code qui avait des événements personnalisés aidé à résoudre tous mes problèmes, mais seulement si l'extrait Google était en haut de la page. Cela m'a beaucoup aidé, et je n'ai pas eu à le mettre dans chaque événement de clic ou dans une fonction n'importe où, à part une fonction prête pour jQuery.