这已经困扰我好几天了,我还没有找到让它工作的方法。我的网站正在使用 Jquery、Jquery-Mobile 和 RequireJS,我想将 Google Analytics 添加到组合中。
我的 Analytics 设置是这样的(另请参见此处):
<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>
所以我正在监听 JQM pageshow 事件以跟踪分析。此代码段粘贴到所有页面的末尾。
我已经像这样将 Analytics 放入 requireJS 中:
主.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();
});
在App.js中:
var start = function() {
require(['order!jquery', 'order!jqm', 'order!analytics'],function() {
// do stuff
});
问题是,Analytics 片段位于每个页面 HTML 标记的末尾,所以虽然我认为我之前在 requireJS 中使用 Jquery 和 Jquery Mobile 加载正确设置了它,但我仍然遇到错误:
$ is not defined
....ocument).on('pageshow', 'div:jqmData(role="page").basePage', function (event, ui...
当第一页加载时。
我猜是因为 HTML 标记超出了 require 的范围,并且在加载 JQM 之前被解析。不过,必须有一种方法来正确设置它。
问题:
知道为什么会弹出错误以及我能做些什么吗?
感谢帮助!
编辑:
好的。这样做是有效的:
在我的页眉中,我声明了第一部分:
<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>
然后在我的 requirejs 启动函数中,我调用了第二个片段:
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();
这样第二个代码片段只会在 Jquery 和 Jquery Mobile 被加载后执行。通过设置一个全局变量(我希望),绑定只会被启动一次。到目前为止似乎工作。