コードを整理し、長い「グローバル」javascript ファイルの必要性を減らすために、javascript のモジュール パターンを学習しています。この結果、最上位の「名前空間」モジュールとユーティリティ モジュールが同じファイルに含まれています。ユーティリティ モジュールには、jquery を必要とする関数と必要としない関数があります。
jQuery を使用しない軽量ページでは、ライブラリをロードしたくありません (ロードしないのには十分な理由があります)。次のように、jQuery がパラメーターとしてモジュールに渡されると、問題が発生します。
MODULE.vars = (function (variables,$) {
variables.cdn = undefined; //global for clientside cdn
variables.version = undefined; //global for clientside cdn version
variables.isTouchScreen = undefined; //global for touchscreen status
//Check if jquery exists, if so patch the jquery dependent functions
if ($) {
$(document).ready(function () {
variables.isTouchScreen = $('html').is('.touch');
});
}
return variables;
}(MODULE.vars || {}, jQuery));
jquery をロードしていないページでコードが停止し、jQuery は未定義であると表示されます。最後の行を次のように変更すると:
}(MODULE.vars || {}, jQuery || false));
コードはまだ jQuery が未定義であると不平を言っています。おそらく誤って、jQuery が未定義の場合、このインスタンスでは undefined として渡され、代わりに false の値を使用するだろうと考えました (いずれにせよ、ロジックが指示するものは必要ありません)。
jQuery が存在する場合と存在しない場合に、この問題を回避するにはどうすればよいですか? スクリプトの先頭に次を配置しようとしました。
var jQuery = jQuery || false;
jQuery がロードされた場合、これが jQuery の値を占めると考えています。これは最新のブラウザーで動作しますが、ページで最初に jQuery が読み込まれている場合でも、false に設定されるため、IE8 は文句を言います。
スクリプトはすべて正しい順序で html にロードされます。最初に jQuery がロードされ、その後にモジュールがロードされます。
原因を調べると、IE8 は $ をオブジェクトとして、jQuery を false として返します。スクリプトで上記の行を設定しないと、jQuery は $ と同じオブジェクトとして返されます。
悲しいことに、私はIE8 にも対応しなければならないので、jQuery のオプションの存在に関するこの問題をどのように回避すればよいでしょうか?
編集:これはモジュールのスニペットにすぎず、jquery に依存する他の関数がありますが、jquery が利用できない場合は実装されません。