我正在学习 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 是未定义的,它会在这个实例中作为未定义传递,而不是占用值 false(无论如何逻辑指示都没有必要)。
当 jQuery 可能存在或不存在时,我该如何解决这个问题?我试图将以下内容放在脚本的顶部:
var jQuery = jQuery || false;
认为如果它被加载,这将占用 jQuery 的值(value)。它适用于现代浏览器,但 IE8 会提示,因为即使 jQuery 首先加载到页面上,它也会被设置为 false。
脚本都以正确的顺序加载到 html 中,首先是 jQuery,然后是我的模块。
检查原因时,IE8 返回 $ 作为对象,jQuery 返回 false。如果我没有在脚本中设置以上行,jQuery 将返回与 $ 相同的对象。
很遗憾,我也需要满足 IE8 的要求,那么我该如何解决这个可选的 jQuery 存在问题呢?
编辑:这只是该模块的一个片段,还有其他依赖于 jquery 的功能,但如果 jquery 不可用,则根本不会实现
最佳答案
在我弄清楚如何实现 elanclrs 建议后,我似乎找到了一个可行的答案 - 我将以下内容放在我的模块顶部:
var jQ = jQ || false;
if (typeof jQuery !== 'undefined') {
jQ = jQuery;
}
然后在我的模块中,我传递 jQ 而不是 jQuery。
这个问题指出了答案背后的原因:Error when passing undefined variable to function?
关于Javascript 模块,在可能未加载时传递 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355043/