我的应用程序的JavaScript使用jQuery和jQuery插件,并在我无法控制的“恶意”环境中运行(这是eCommerce平台的PHP扩展)。因此,无法确定我的jQuery代码是否会在有人附加他的jQuery /插件实例(由其他扩展引入)之前执行,或者在此之后执行,或者有人会在页面呈现后动态加载jQuery。
基本上,问题是其他扩展也可以使用jQuery (带有插件),仅仅使用标签连接jQuery将不起作用。
我有一种强烈的感觉,RequireJS可能会帮助我将所需的jQuery版本加载到封装的作用域中,而不会污染全局作用域(因此其他扩展仍然可以正常工作)。然后,我将把我的所有代码包装到"require“语句中,它将使用自己的一组jQuery和插件来运行。我试过了,它的效果不错(虽然还没有在生产环境中测试过),但是用了一些奇怪的方式。看起来this question和我遇到的问题有关。同时回答建议使用兼容AMD的jQuery版本。但是插件呢?我不认为我使用的所有插件都有这样的版本。
所以问题是:
是否可以使用RequireJS来涵盖这样的用例(在未定义的环境中运行jQuery+plugins )?如果可以在那里使用RequireJS,那么任何示例代码或如何正确执行此操作的解释都将不胜感激。如果没有办法用RequireJS来解决这个问题,你认为处理这个问题的最佳方法是什么?
发布于 2012-08-20 04:49:37
是的,我相信RequireJS可以帮你解决这个问题。不过,据我所知,你得做些跑腿的工作。看看(截至2012-08-19)最新jQuery的来源:link。在底部,您可以看到正在设置window.jQuery,定义了jQuery和$。在那之后会发生对AMD loader的define调用,所以jQuery无论如何都在全局范围内。您想要做的是保证您自己的jQuery和插件版本与其他jQuery实例和插件隔离,对吗?
将您的自定义自定义和插件放入它们自己的目录中(让我们称之为“jQuery”),并在脚本的define调用中指定依赖项时使用该目录。您可能希望修改您的jQuery版本,方法是将其包装在define调用中,并在最底部返回jQuery对象,去掉jQuery的window.jQuery和window.$赋值以及进程中的默认define调用(记住,它们都在底部)。然后,您需要将所有插件包装在define调用中,并指定您自己的jQuery版本作为依赖项。示例:
define(['jqcustom/jquery'], function(jQuery) {
//inside this method 'jQuery' will override any predefined global window.jQuery
//in case any plugins use the $ variable, define that locally too
var $ = jQuery;
//... plugin code ...
});如果你使用RequireJS的优化器,它可以用它的shim config选项为你包装插件。jQuery插件的工作原理是将方法添加到jQuery的prototype对象中,所以我相信只要您将相同的jQuery (您的自定义jqcustom/jquery one)传递给每个带有define包装的插件,插件的扩展都将设置在相同的对象上,并且可以在随后的define调用中访问,指定您的自定义jQuery或自定义插件作为依赖项。祝好运!
https://stackoverflow.com/questions/12029617
复制相似问题