使用捆绑的jQuery管理第三方javascript库

时间:2010-12-14 15:06:07

标签: javascript jquery

我正在开展网站全球化项目,该项目涉及(我们的供应商)要求我们的客户在其主页/原始网站上插入脚本标记。脚本标记对于帮助我们的客户走向全球是必要的,并且该解决方案的一部分体现了基于特定最终用户标准触发的UI。

UI是在jQuery的帮助下构建的,我们真的不能指望我们的客户在他们的页面上插入,更不用说版本不匹配将很难解决。因此,我们的第三方库下载自己的jQuery版本,尽管命名空间不同,以避免任何冲突。

然而,这样的机制要求我们将jQuery的所有实例重命名为能够帮助我们避免与另一个jQuery实例(如果存在)的名称冲突,并使我们的jled jQuery(下面的例子中的MY_Query)很难管理,更不用说升级了。

例如

jQuery = window.jQuery = window.$ = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context );
}, 
.
.
.
jQuery.fn = jQuery.prototype = ...

变为

MY_JQuery = window.MY_JQuery = window.MY_Q = function( selector, context ) {
    // The MY_JQuery object is actually just the init constructor 'enhanced'
    return new MY_JQuery.fn.init( selector, context );
},
.
.
.
MP_JQuery.fn = MP_JQuery.prototype = ...

在理想的世界中,我们和客户都会在网站上拥有单一版本的jQuery,我们都会利用它来发挥优势。但这意味着jQuery的升级需要双方进行大量测试(同时包含受损的jQuery版本),并且任何想要的插件都需要客户端在其网站上添加适当的脚本标签,从而激发双方之间的政治辩论什么版本赢了。

那么,我可以在客户端站点上管理我们的jQuery版本(带插件),而不必使用上面提到的约束来重命名jQuery的所有jQuery实例吗?

2 个答案:

答案 0 :(得分:4)

为什么不检查它们是否已经包含在页面上的jQuery,如果没有动态加载它?如果你知道jQuery所需的基本级别,你可以检查这个:

if( !jQuery || !jQuery.fn.jquery === "1.4.4"){
  var url = "http://code.jquery.com/jquery-1.4.4.js";
  var script = document.createElement( 'script' );
  script.type = 'text/javascript';
  script.src = url;
  document.body.appendChild(script);
}

您可能希望改进版本检测以确保它在1.4.4之后没有版本,但我确信您可以自己编写代码; - )

====根据反馈进行编辑

因此您需要在页面上维护多个版本的jquery。你尝试过这样的事情:

var original_jquery = $().noConflict();
original_jquery.getScript("http://code.jquery.com/jquery-1.4.4.js");
var new_jquery = $().noConflict();
window.$ = original_jquery;

然后使用new_jquery作为jquery的版本?我没有对此进行测试以确定它是否可行,但您可能会对此感到满意。

====最终编辑

正如你所提到的,我上面的javascript并不完全正确,所以我在控制台中尝试了一些东西。是的,您不需要保存旧版本的jQuery,因为jQuery在noConflict方法中执行此操作。所以只需调用getScript,然后调用noConflict,但保存到一个新变量:

>> $.fn.jquery
"1.4.2"
>> $.getScript("http://code.jquery.com/jquery-1.4.4.js");
undefined
>> $.fn.jquery
"1.4.4"
>> var new_jquery = $.noConflict();
undefined
>> new_jquery.fn.jquery
"1.4.4"
>> $.fn.jquery
"1.4.2"

答案 1 :(得分:1)

您是否尝试过使用JQuery.noConflict()。这听起来可以帮到你。