2

コードを整理し、長い「グローバル」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 が利用できない場合は実装されません。

4

1 に答える 1

1

elanclrsの提案を実装する方法を見つけた後、機能する答えを見つけたようです-モジュールの上部に以下を配置しました:

var jQ = jQ || false;
   if (typeof jQuery !== 'undefined') {
   jQ = jQuery;
}

次に、私のモジュールでは、jQuery の代わりに jQ を渡します。

答えの背後にある理由は、この質問で指摘されました:未定義の変数を関数に渡すときにエラーが発生しましたか?

于 2013-05-03T09:31:15.350 に答える