我有一个使用jQuery的小部件,它被添加到我无法控制的其他各种网站中,可能会也可能不会加载任何版本的jQuery的一个或多个实例。我到现在为止加载jQuery和jQueryUI并使用noConflict来恢复全局变量。我还异步加载所有资源,并在加载jQuery和jQueryUI之间有一个延迟以提高效率(我不需要马上使用jQueryUI)。现在我有这个问题:首先我的jQuery加载(我在本地保存window.jQuery),然后加载本机jQuery,然后jQueryUI加载到他们的jQuery中。我已经尝试过了:
var jQueryOriginal = window.jQuery;
var original$ = window.$;
window.jQuery = localJQuery;
window.$ = local$;
promise = loadResource(url + "?r=" + rand).then(function() {
localJQuery = window.jQuery;
local$ = window.$;
window.jQuery = jQueryOriginal;
window.$ = original$;
});
不知道$是否是必要的,并补充说如果没有它就没有工作,但无论如何这根本没有帮助。这可能是因为我保存变量后他们的库正在加载,不确定。
无论哪种方式,对我(和网站)最好的事情是将jQuery和jQueryUI直接加载到本地或备用变量,而不是默认窗口。$和window.jQuery。这可能吗?
答案 0 :(得分:0)
我刚刚想出了一个jquery-ui的解决方案,我希望也可以帮助其他人。仍然在寻找在本地加载jQuery本身的解决方案。
jquery-ui代码引用了一个全局jQuery变量。如果你将库包装在:
中function loadJQueryUIInto(jQuery) {
// jquery-ui code
return jQuery;
}
然后在包含jquery-ui代码后,你可以这样做:
localJQuery = loadJQueryUIInto(localJQuery);
如果您自己托管jquery-ui库(不建议除非您有CDN可以使用它),您可以直接包装该函数。或者,在通过XHR获取脚本代码之后,只需在eval中包含额外的代码:
var runBefore = 'function aspectivaLoadJQueryUIInto(jQuery) {';
var runAfter = 'return jQuery;}';
eval.apply(window, [ runBefore + script + runAfter ]);
关于jquery本身,如果你在AMD环境中加载它,我认为你可以得到一个独立的对象。除此之外,看起来它不适合本地加载,因为它与窗口对象捆绑在一起。