我可以在局部变量中加载JQuery和JQueryUI,而不使用noConflict吗?

时间:2016-11-21 12:47:59

标签: jquery jquery-ui

我有一个使用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。这可能吗?

1 个答案:

答案 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环境中加载它,我认为你可以得到一个独立的对象。除此之外,看起来它不适合本地加载,因为它与窗口对象捆绑在一起。