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

IT技术 asp.net javascript jquery
2021-01-15 14:43:34

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

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

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

5个回答

您可以通过在无冲突模式下运行您的 jQuery 版本来实现这一点“无冲突”模式是让 jQuery 在具有其他框架(如原型)的页面上工作的典型解决方案,也可以在这里使用,因为它本质上为您加载的每个版本的 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 内容都需要使用 usingjq13而不是$,例如

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 版本之后立即调用 jQuery.noConflict
2021-03-23 14:43:34
mtyaka 是完全正确的。如果传入 'true' 参数,则无需担心加载脚本的顺序。将 'true' 传递给 noconflict 会将 'jQuery' 变量和 '$' 变量恢复到原来的状态。没有它,只有 '$' 被恢复。
2021-04-10 14:43:34

正如 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 关键字声明它,或者,如果在函数内部,则手动将变量附加到 window 对象。请参阅javascript.crockford.com/code.html#variable%20declarations
2021-03-20 14:43:34
没有 var 在这里没什么大不了的。没有 var 定义的变量具有全局作用域。希望jq13 对象具有全局范围。
2021-03-28 14:43:34

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

让工作变得虚假

var jq16 = $.noConflict(false);

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


        });
    }