Cela me dérange depuis quelques jours et je n'ai pas trouvé le moyen de le faire fonctionner. Mon site utilise Jquery, Jquery-Mobile et RequireJS et je souhaite ajouter Google Analytics au mixage.Comment configurer Google Analytics avec Jquery, Jquery Mobile et RequireJS?
Ma configuration Analytics est comme si (voir aussi here):
<script type="text/javascript">
var _gaq = _gaq || [];
(function() {
... regular stufff
})();
// bind to pageshow event
$(document).on('pageshow', 'div:jqmData(role="page").basePage', function (event, ui) {
try {
_gaq.push(['_setAccount', 'ID';
_gaq.push(['_gat._anonymizeIp']);
var url = location.href;
try {
if (location.hash) {
url = location.hash;
}
_gaq.push(['_trackPageview', url]);
} catch(err) {}
});
</script>
Je suis à l'écoute de l'événement pageshow de JQM à suivre pour Analytics. Cet extrait est collé à la fin de toutes les pages.
Je tripoté Analytics dans requireJS comme ceci:
main.js:
require.config({
baseUrl: "../js/",
paths: {
"jquery": "libs/jquery/jquery.min",
"jqm": "libs/jquery-mobile/jquery-mobile.min",
"analytics": "https://www.google-analytics.com/ga"
}
require(['order!jquery', 'order!jqm', 'order!analytics', 'app'],
function(jquery, jqm, analytics, App){
App.start();
});
Et app.js:
var start = function() {
require(['order!jquery', 'order!jqm', 'order!analytics'],function() {
// do stuff
});
Le problème est, Analytics extrait est à la fin de chaque balise HTML de la page, donc même si je pense que je l'ai mis en place correctement dans requ ireJS avec JQuery et JQuery chargement mobile avant, je suis toujours obtenir une erreur:
$ is not defined
....ocument).on('pageshow', 'div:jqmData(role="page").basePage', function (event, ui...
lorsque les premières charges de page.
Je suppose que le balisage HTML est hors de la portée de require et est analysé avant le chargement de JQM. Cependant, il doit y avoir un moyen de le configurer correctement.
Question:
Toute idée pourquoi l'erreur apparaît et ce que je peux faire à ce sujet?
Merci pour votre aide!
EDIT:
Ok. Faire comme cela fonctionne:
Dans ma tête de page Je déclare la première partie:
<script type="text/javascript">
var _gaq = _gaq || [];
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
Puis dans mes requirejs fonction de démarrage J'appelle le 2ème extrait:
var start = function() {
require(['order!jquery', 'order!jqm'],function() {
var analyticsHasBeenSet;
...
var analyize = function() {
if (analyticsHasBeenSet != true){
analyticsHasBeenSet = true;
require(['https://www.google-analytics.com/ga.js'], function (App) {
$(document).on('pageshow', 'div:jqmData(role="page"), function() {
_gaq.push(['_setAccount', '']);
_gaq.push(['_gat._anonymizeIp']);
var url = location.href;
try {
if (location.hash) {
url = location.hash;
}
_gaq.push(['_trackPageview', url]);
} catch(err) { // error catch }
});
});
}
}
analyize();
De cette façon, le deuxième extrait ne sera exécuté qu'une fois Jquery et Jquery Mobile chargés. En définissant une variable globale (j'espère), la liaison ne sera lancée qu'une seule fois. Jusqu'à présent, semble fonctionner.
hm. Merci pour la contribution. Je vais regarder dans cela. J'ai également pensé à déplacer la 2ème partie du code Analytics vers la fonction INSIDE my start, donc il ne va définir la liaison de page qu'une fois Jquery et JQM chargés. Il ne sera pas sur la page actuelle, mais tant que je suis la logique JQM (la première page reste toujours dans le DOM, donc le script sera toujours actif), je devrais être ok, n'est-ce pas? – frequent
une autre question: Dites que j'utilise un plugin qui dépend de JQuery et JQM mais doit mock-up chaque page, avant que la page est affichée. Dois-je faire cette var globale, bien que ce soit juste un plugin régulier ou devrais-je aussi l'appeler dans ma fonction start() seulement? Merci! – frequent
Je ne suis pas certain de comprendre clairement ces questions. Première question, le code qui utilise réellement le code _gaq devrait être dans le callback de require, car c'est la seule fois où vous pouvez être sûr que le fichier ga.js sera chargé. Deuxième question, je ne sais pas ce que vous voulez dire en se moquant de la page? Il y a une page pratique sur l'utilisation de jQuery et des plugins sur le site requireJS - http://requirejs.org/docs/jquery.html –