我正在学习 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 不可用,则根本不会实现