是否有一种优雅的方式来缓慢升级jQuery?

时间:2011-03-08 19:46:59

标签: jquery asp.net version-control jquery-plugins

我们希望从一个版本的jQuery升级到另一个版本。我们使用各种在线插件,并编写了许多我们自己的插件。现在的挑战是试图缓慢地缓慢移植所有脚本对象,而不需要完全重写。我对如何处理这个问题有一个想法:

但我有疑问:

  1. 这个想法下面是个好主意吗?
  2. 我可以(直接)告诉每个jQuery对象依赖的位置吗?
  3. 如果这是一个坏主意......你如何处理它?<​​/ li>
  4. 我是否只是重新编写在升级时会破坏的每个对象? (SUX!)
  5. 解释问题:
    如果您的所有插件仅在单个页面的范围内存在,则可以轻松解决不同的版本:只需在页面级别而不是主页面级别执行文件包括(呃!)。但是,存在于主页面或用户控件中的对象有点困难......因为它们需要特定版本才能正确运行。

    这是我的想法:
    插件的定义以匿名函数开头。

    (function ($){<!- code goes here -->})(jQuery);
    

    我见过的所有依赖项都以此为出发点。

    实施例: jQuery依赖包括插件,如:ui.widget,ui.position,ui.core等。

    那么如果我使用JavaScript对象引用每个版本的jQuery(及其依赖项)并将THAT OBJECT传递给各种内部和在线插件呢?

    对象参考可能会像这样:

    var jQueryVersion1_3_2 = function(){<!- paste the files contents here-->};
    var jQueryVersion1_4_4 = function(){<!- paste the files contents here-->};
    

    PLUG-INS:
    我的内部和在线插件仍可作为(普通)文件链接包含在内,但有以下更改

    从这里开始:

    // Plug-in X
    (function ($){<!- its untouched code -->})(jQuery);
    // Plug-in Y
    (function ($){<!- its untouched code -->})(jQuery);
    // Plug-in Z
    (function ($){<!- its untouched code -->})(jQuery);
    

    ......版本很糟糕!

    到这......

    // Plug-in X
    (function ($){<!- its untouched code -->})(jQueryVersion1_3_2);
    // Plug-in Y
    (function ($){<!- its untouched code -->})(jQueryVersion1_3_2);
    // Plug-in Z
    (function ($){<!- its untouched code -->})(jQueryVersion1_4_4);
    

    ...现在我们可以慢慢升级我们的对象。

    我看到的唯一问题:
    挑战成为插件依赖(版本之间)。在测试升级中,以下内容开始突破各种插件,例如:

    • ui.widget,ui.position,ui.core等(升级后全部破产)。

    我看到的唯一答案是:
    将jQuery和所有各种引用包装到单个函数中并将THAT保存到上面的变量中。然后将THAT中间对象传递给每个插件AS jQuery。

    帮助我Obi-Wan Kenobi ......你是我唯一的希望!

1 个答案:

答案 0 :(得分:1)

使用$ .noConflict全局创建所有版本

<script src="jquery 1.x" />
<script> 
    var jQuery_1_x = $.noConflict(true);
</script>
...

然后将每个jQuery插件,内部或第三方包装在闭包中,如:

(function(jQuery, $) {

    ... // code

}(jQuery_1_x, jQuery_1_x));

使用此方法唯一可以解决的是第三方代码,它在任何函数之外使用var foo来创建全局对象。您需要查找任何全局函数/对象/方法,并使用

手动提升它们

window.foo = ...

值得庆幸的是,通过该方法创建全局函数/对象/方法被认为是不好的形式,因此不应该有太多这些。