【问题标题】:Is there an elegant way to upgrade jQuery slowly?有没有一种优雅的方式来慢慢升级 jQuery?
【发布时间】:2011-03-08 19:46:59
【问题描述】:

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

但我有问题:

  1. 下面的想法是个好主意吗?
  2. 我可以(直接)告诉每个 jQuery 对象依赖项所在的位置吗?
  3. 如果这是个坏主意……您将如何处理?
  4. 我是否只是简单地重写每个在升级时发生中断的对象? (苏克斯!)

解释问题:
如果您的所有插件仅在单个页面的范围内有效,那么很容易解决不同的版本:只需在页面级别而不是母版页级别进行文件包含(呵呵!)。但是,存在于母版页或用户控件中的对象有点困难......因为它们需要特定的版本才能正确运行。

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

(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-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 和所有各种引用包装到一个函数中,并将其保存到上面的变量中。然后将那个中间对象传递给每个插件 AS jQuery。

帮助我欧比旺·克诺比……你是我唯一的希望!

【问题讨论】:

  • 这是什么原因?您认为您的某些插件在升级后会停止工作吗? (只是好奇......根据我的经验,迁移到更新版本的 jQuery 一直很轻松)
  • 您是否使用了那么多已弃用的功能?您可以随时查看http://docs.jquery.com/Release:jQuery_1.3.2(使用相关版本更改 1.3.2)并查看可能需要更改的内容。否则,加载每个库和 var jQuery_1_3_2 = $.noConflict() 可能是您最好的选择(尽管可以说是很多开销)。
  • 请记住,我们不想重新编写每个插件。我们一次只想接触几个。我们有许多插件:一些是内部开发的,另一些来自在线资源。是的......由于被弃用等,对象一旦升级就会失败。但这不是问题。我已经知道如何痛苦地猜测和测试......我正在寻找更优雅的东西。
  • @Robalot:Elegent 可能正在更改每个插件的范围,然后创建一个处理程序,该处理程序可以传递一个 jQuery 版本并获取该版本,并在文件中执行查找/替换(省去加载每一个并调用.noConflict) 寻找jQuery 并使其成为jQuery_&lt;version&gt; 的麻烦。类似&lt;script src="jQuery.ashx?ver=1.3.2"&gt; 的东西返回jQuery_1_3_2,然后是(function($){...})(jQuery_1_3_2); 的引用
  • @Brad:我真诚地感谢您的反馈。也许我不明白……这和我上面的想法有什么不同?

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


【解决方案1】:

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

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

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

(function(jQuery, $) {

    ... // code

}(jQuery_1_x, jQuery_1_x));

唯一可以用这种方法破坏的是第 3 方代码,它在任何函数之外使用 var foo 来创建全局对象。您需要查找任何全局函数/对象/方法并使用手动提升它们

window.foo = ...

谢天谢地,创建全局函数/对象/方法无论如何都被该方法认为是不好的形式,因此不应有太多。

【讨论】:

  • 问题:使用 noConflict(true) 会从全局范围中删除所有 jQuery 变量...那么当您想使用 2 个变量来保存不同版本的 jQuery 时,它对您有什么帮助? - 谢谢
  • noConflict 的作用如下:window.$ = _$; if (deep) window.jQuery = _jQuery;返回 jQuery;我所看到的只是它将 jQuery 对象写入窗口中的全局变量(而不是 $)......所以我必须遗漏一些东西。 -谢谢
  • @Robalot 在加载某个版本的 jQuery 时会将 $jQuery 中的变量缓存到 _S_jQuery 中。 jQuery 的第一次加载将缓存undefined。它的作用是设置undefined 值支持并返回对$ 的引用。所以它将 jQuery 从全局范围中移除并返回 jQuery。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2010-09-07
相关资源
最近更新 更多