これは数日間私を悩ませてきました、そして私はそれを機能させる方法を見つけられませんでした。私のサイトはJquery、Jquery-Mobile、RequireJSを使用しており、GoogleAnalyticsを追加したいと考えています。
私のアナリティクスのセットアップはそのようなものです(ここも参照してください):
<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ページショーイベントを聞いています。このスニペットは、すべてのページの最後に貼り付けられます。
私はAnalyticsを次のようにrequireJSにいじりました:
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();
});
そしてApp.jsで:
var start = function() {
require(['order!jquery', 'order!jqm', 'order!analytics'],function() {
// do stuff
});
問題は、AnalyticsスニペットがすべてのページのHTMLマークアップの最後にあるため、以前にJqueryとJquery Mobileを読み込んでrequireJSで正しく設定したと思いますが、それでもエラーが発生します。
$ 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 start関数内で、2番目のスニペットを呼び出しています。
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();
このように、2番目のスニペットはJqueryとJqueryMobileがロードされた後にのみ実行されます。グローバル変数を設定することにより(私は願っています)、バインディングは1回だけ開始されます。これまでのところうまくいくようです。