如何在同一页面上运行不同版本的jQuery?


68

我公司购买了在页面上呈现ASP.NET控件的产品。该控件使用jQuery 1.2.3并将脚本标签添加到页面以引用它。如果控件以任何方式修改(包括修改以引用其他版本的jQuery),则控件的开发人员将不支持使用该控件。

我将开始开发自己的控件,并希望使用jQuery 1.3的功能和速度改进。这两个控件都需要存在于同一页面上。

如何允许购买的控件使用jQuery 1.2.3和新的自定义开发使用jQuery 1.3?同样出于好奇,如果我们要使用一个需要引用另一个版本的jQuery的附加控件怎么办?


1
控件作者的作者不会发布更新吗?还是新版本不兼容?奇怪的是,一个商业第三方控件供应商创建了一个控件,该控件被硬编码到经常更新的特定版本的开源javascript中。
BlackMael

如果您使用坚持固定版本的jQuery的多服务器控件,那么我看不出您有什么想法。
BlackMael

1
并非每个插件作者都会精心更新/能够定期更新其代码。我也遇到了这个问题,但是后来我切换到了一个由社区驱动的经常更新的版本。
罗宾·马本

我们在门户网站环境中也遇到类似的问题。每个portlet开发人员都可以/将捆绑与他们测试其应用程序/ portlet的jQuery版本,并且大多数情况下将不进行同步。
Stefan 2012年

Answers:


100

您可以通过在无冲突模式下运行jQuery版本来实现。“无冲突”模式是使jQuery与其他框架(例如prototype)一起在页面上工作的典型解决方案,并且也可以在这里使用,因为它实质上是您加载的每个jQuery版本的命名空间。

<script src="jQuery1.3.js"></script>
<script>
    jq13 = jQuery.noConflict(true);
</script>

<!-- original author's jquery version -->
<script src="jQuery1.2.3.js"></script>

此更改将意味着您需要使用jq13而不是调用要使用的任何jQuery东西$,例如

jq13("#id").hide();

在同一页面上同时运行两个版本不是理想的情况,但是如果您别无选择,则上述方法应允许您一次使用两个不同的版本。

同样出于好奇,如果我们要使用一个需要引用另一个版本的jQuery的附加控件怎么办?

如果您需要添加其他版本的jQuery,则可以在上面进行扩展:

<script src="jQuery1.3.js"></script>
<script>
    jq13 = jQuery.noConflict(true);
</script>
<script src="jQuery1.3.1.js"></script>
<script>
    jq131 = jQuery.noConflict(true);
</script>

<!-- original author's jquery version -->
<script src="jQuery1.2.3.js"></script>

变量jq13jq131将分别用于所需的特定于版本的功能。

重要的是,原始开发人员使用jQuery必须最后加载-原始开发人员可能会在假设$()使用其jQuery版本的情况下编写其代码。如果您在它们之后加载另一个版本,则它们$将被您上次加载的版本“夺走”,这意味着原始开发人员的代码在最新的库版本上运行,从而呈现出noConflicts一定程度的冗余!


11
订购真的很重要吗?noConflict函数的全部要旨不是将“ $”变量返回给原始所有者吗?订购不重要。但是,重要的是,应加载进入非冲突模式的jQuery版本之后,立即调用jQuery.noConflict 。
mtyaka

4
mtyaka是完全正确的。如果您传递“ true”参数,则无需担心加载脚本的顺序。将'true'传递给noconflict会将'jQuery'变量和'$'变量都恢复到原来的状态。没有它,仅还原“ $”。
Muhd

24

正如ConroyP所说的,您可以这样做,jQuery.noConflictvar在声明变量时不要忘记。像这样。

<script src="jQuery1.3.js"></script>
<script>
    var jq13 = jQuery.noConflict(true);
</script>

<!-- original author's jquery version -->
<script src="jQuery1.2.3.js"></script>

您可以通过在函数的后面添加(jq13)将所有$连接到jq13 })。像这样

(function($) {
 ... 
})(jq13); 

5
没有var在这里没什么大不了的。不带var定义的变量具有全局作用域。您希望jq13对象具有全局范围。
艾伦·斯托姆

3
隐式全局变量是不好的编码习惯。如果确定要使用全局变量,则应在全局范围内使用var关键字声明它,或者如果在函数内部,则将该变量手动附加到window对象。请参阅javascript.crockford.com/code.html#variable%20declarations
Muhd



0

在第二个版本中,将变量声明为$ .noConflict(true)。并使用声明的变量代替jquery代码中使用的$。请检查以下代码:在声明第二个版本的jquery之后使用此代码:

<script type="text/javascript">
var jQuery_1_9_1 = $.noConflict(true); function pageLoad(sender, args) {

        var $ddl = jQuery_1_9_1("select[name$=drpClassCode]");
        var $ddl1 = jQuery_1_9_1("select[name$=drpSubContractors]");
        $ddl.select2();
        $ddl1.select2();

        $ddl.bind("change keyup", function () {
            $ddl.fadeIn("slow");


        });

        $ddl.bind("change keyup", function () {
            $ddl1.fadeIn("slow");


        });
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.