只能在闭包中加载jQuery

Possible to load jQuery only inside closure?

本文关键字:加载 jQuery 闭包      更新时间:2023-09-26

我认为这是无法做到的,尽管我知道requirejs可以做类似的事情,我想知道这是否可以在require之外实现。

我正在编写一段SaaS JavaScript代码,它很可能需要jQuery来跨浏览器运行。有些网站有,有些没有,但如果他们不使用它,我不想将 jQuery 粘贴在窗口对象上。虽然我可以单独为我使用 jQuery 的所有内容创建替代方案......我想知道是否有一种方法可以加载 jQuery 仅在我的闭包中使用。这可能吗?

当你加载jQuery的标准版本时,默认情况下jQuery将自身分配给全局名称jQuery和$。如果你在页面中的闭包文件之前加载你的jQuery版本,那么在你的闭包中做

var $ = jQuery.noConflict(true);

它将撤消您的 jQuery 版本对全局对象所做的任何修改。

但是,值得注意的是,这会产生争用条件。如果在加载 jQuery 文件和闭包调用之间触发任何事件或超时jQuery.noConflict(true)它们将意外使用您加载的 jQuery 版本。

另一种方法是编辑您正在使用的 jQuery 文件,以便在 jQuery 文件底部包含对 jQuery.noConflict(true) 的调用。您可以将结果分配给其他人不会想到使用的任意名称,例如"abcRandomNumberHere"。然后,您可以在闭包中从该全局名称中检索 jQuery 实例,将其分配给名为 jQuery 和/或 $ 的局部变量,并在那时删除全局引用。

// Your jQuery file on your server
// ...
// End of file:
someRandomGlobalName = jQuery.noConflict(true);
// The file that contains your closure:
(function() {
    var $, jQuery;
    $ = jQuery = someRandomGlobalName;
    delete window.someRandomGlobalName;
    // Your code that uses jQuery here
} ());

这是 RequireJS 为将 jQuery 排除在全局命名空间之外所做的粗略近似。最新版本的jQuery具有内置代码,可以检测脚本加载器(如RequireJS(的存在,而不是分配给全局名称jQuery,而是将对自身的引用传递到RequireJS中,并使全局对象保持不变。这样,RequireJS在内部包含对jQuery的引用,但全局.requirejs变量被修改。

为jQuery版本创建自己的非冲突全局名称,并关闭"会合"类似于RequireJS的功能。 RequireJS使用的名称是"全局名称":requirejs.s.contexts._.jQuery(不完全是,而是像这样(。

调用jQuery.noConflict(true),它会将$重新分配给它所在的位置,并将jQuery重新分配给它所在的位置。

然后,您可以将上述表达式返回的引用传递到闭包中。

(function(jQuery) {
})(jQuery.noConflict(true));

是的,调用jQuery.noConflict(true)将完全删除 jquery 从全局命名空间中添加的任何内容,将其恢复到以前允许冲突库和/或多个版本的 jQuery 的状态。

<script src="jquery.min.js"></script>
<script>
(function($){
    $("el").doSomething();
})(jQuery.noConflict(true));
</script>