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 的值。它可以在现代浏览器中使用,但 IE8 会抱怨,因为它被设置为 false,即使 jQuery 是首先在页面上加载的。

这些脚本都以正确的顺序在 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;
}

然后在我的模块中,我通过 jQ 而不是 jQuery。

这个问题指出了答案背后的原因:将未定义的变量传递给函数时出错?

于 2013-05-03T09:31:15.350 回答