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

Posted

技术标签:

【中文标题】如何在同一页面上运行不同版本的 jQuery?【英文标题】:How do I run different versions of jQuery on the same page? 【发布时间】:2010-10-06 09:47:17 【问题描述】:

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

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

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

【问题讨论】:

控件作者的作者不发布更新吗?还是新版本不兼容?很奇怪,一个商业第三方控件供应商创建了一个控件,该控件被硬编码为一个经常更新的开源 javascript 的特定版本。 如果您使用坚持使用固定版本 jQuery 的多个服务器控件,我看不出您是如何不被搞砸的。 并非每个插件作者都一丝不苟地更新/能够定期更新他的代码。我也遇到过这个问题,但后来我切换到了一个经常更新、社区驱动的同类产品。 我们在门户环境中遇到了类似的问题。每个 portlet 开发人员都可以/将捆绑他们测试其应用程序/portlet 的 jQuery 版本,并且大多数情况下不会同步。 【参考方案1】:

您可以通过在no-conflict mode 中运行您的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>

此更改意味着您要使用的任何 jQuery 内容都需要使用 jq13 而不是 $ 来调用,例如

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 有点多余!

【讨论】:

顺序真的很重要吗? noConflict 函数的全部意义不在于将“$”变量返回给原始所有者吗?订购不应该很重要。重要的是,jQuery.noConflict 在应该进入非冲突模式的 jQuery 版本被加载之后立即被调用。 mtyaka 是完全正确的。如果传入“true”参数,则无需担心加载脚本的顺序。将 'true' 传递给 noconflict 会将 'jQuery' 变量和 '$' 变量恢复到原来的状态。没有它,只有 '$' 被恢复。【参考方案2】:

似乎顺序无关紧要...例如:http://gist.github.com/136686。控制台输出位于顶部,所有版本似乎都在正确的位置。

【讨论】:

【参考方案3】:

正如 ConroyP 所说,您可以使用 jQuery.noConflict 执行此操作,但在声明变量时不要忘记 var。 像这样。

<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); 

【讨论】:

没有 var 在这里没什么大不了的。没有 var 定义的变量具有全局范围。您希望 jq13 对象具有全局范围。 隐式全局变量是不好的编码习惯。如果你确定你想要一个全局变量,你应该使用 var 关键字在全局范围内声明它,或者,如果在函数内,手动将变量附加到窗口对象。见javascript.crockford.com/code.html#variable%20declarations【参考方案4】:

在第二个版本中,将变量声明为 $.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");


        );
    

【讨论】:

【参考方案5】:

让它工作起来是假的

var jq16 = $.noConflict(false);

【讨论】:

以上是关于如何在同一页面上运行不同版本的 jQuery?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个项目中加载多个 jquery 版本但不同的页面

同一个页面,加载不同版本jQuery

同一个页面引用不同版本jquery库

同一页面中的不同 jQuery 源代码和版本(googleapi,代码)

我如何在一页中使用多个jquery版本[重复]

JQuery 验证问题:我在同一页面上有 2 个表单,每个表单在 2 个不同的选项卡中,但只有一个验证不起作用