【问题标题】:Is it possible to use 2 versions of jQuery on the same page?是否可以在同一页面上使用 2 个版本的 jQuery?
【发布时间】:2010-05-14 20:20:08
【问题描述】:

注意:我知道 herehere 已经提出了类似的问题,但我正在寻找有关如何使这项工作或完全避免它的充分理由的更多说明。

我正在向已经使用旧版 jQuery 库 (1.1.3.1) 的现有网站添加功能。我一直在针对最新版本的 jQuery 库 (1.4.2) 编写我添加的功能。我只使用较新版本的 jQuery 测试了该网站,但它破坏了功能,所以现在我正在考虑在同一页面上使用这两个版本。这怎么可能?

我需要在我的代码中做什么来指定我使用的是一个版本的 jQuery 而不是另一个?例如,我会将两个版本的 jQuery 的 <script> 标签放在页面的标题中,但是我需要做什么才能在调用代码中确定我正在调用库的一个版本还是其他?

可能是这样的:

//Put some code here to specify a variable that will be using the newer
//version of jquery:
var $NEW = jQuery.theNewestVersion();

//Now when I use $NEW, I'll know it's the newest version and won't
//conflict with the older version.
$NEW('#personName').text('Ben');

//And when I use the original $ in code, or simply 'jquery', I'll know
//it's the older version.
$('#personName').doSomethingWithTheOlderVersion();

更新:在阅读了一些答案后,我开始怀疑尝试玩这个游戏是否是一个好主意......

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以使用 jQuery noConflict 方法来实现这一点。

    <script type="text/javascript" src="jquery-1.1.3.js"></script>
    <script type="text/javascript" src="jquery-1.4.2.js"></script>
    <script type="text/javascript">
        //Here, $ refers to the most recent jquery script loaded, which is version 1.4.2.
        $.noConflict();
    
        //Here, jQuery refers to 1.4.2 and $ refers to 1.1.3
        //You can setup an alias like so:
        var $NEW = jQuery;
    
        //Now, you can use old jQuery with $ and new jQuery with $NEW.
    </script>
    

    【讨论】:

    • 感谢您的代码。假设当我调用 $.noConflict() 时,我总是调用在我的 &lt;script&gt; 声明中列在第二位的 jQuery 版本,是否安全?
    • @Ben 是的。加载第二个脚本并保存对第一个 $ 变量的引用,以防您调用 noConflict。
    【解决方案2】:

    可能?是的,就像可以同时运行 jQuery 和另一个使用名称 $ 的框架一样。包含一个 jQuery 副本并使用 noConflict 将其分配给一个新名称,然后对另一个副本执行相同操作。

    好主意?真的,就像同时运行 jQuery 和另一个框架不是一个好主意一样,只有更多。 jQuery 是一个影响深远的侵入性框架。如果 jQuery 的两个实例开始改变同一个元素(并且 1.4 之前的 jQuery 版本对于它们所接触的元素非常混杂),它们很可能会因不可预测、时间敏感和不可调试的副作用而相互混淆。

    如果可能的话,更新所有代码以在最新的 jQuery 下运行是迄今为止更好的方法。这真的不应该那么困难; jQuery 开发人员并没有破坏很多代码本来应该依赖的东西。

    【讨论】:

    • 我同意更新现有代码是一个更好的主意。但是,至少据我所知,jQuery 的侵入性比许多其他库要小(例如,我在其他库中没有看到“noConflict”)
    • jQuery 为它“接触”的所有元素添加了一个 expando 属性,即所有附加了 data 的元素(例如事件处理程序),以及在 1.4 之前它甚至检查过的所有元素用于附加数据(这很容易成为文档的大部分内容 — 令人难以置信的侵入性!)。如果另一个框架或版本复制、删除或更改这些属性,jQuery 将处于不一致的状态。
    • 我同意你的假设,这可能不是一个好主意。不过,我被困住了,因为升级网站以使用 1.4.2 根本不是一种选择。哦,动态语言的乐趣……
    【解决方案3】:

    你不应该这样做,$.noConflict() 在所有情况下都不会真正帮助你。
    这是因为,在内部,jQuery 使用别名 jQuery 所以忘记了
    任何美元符号$ 重新分配...如果您将使用任何使用 jQuery 的代码,如下所示:
    jQuery('div').doSomethingDepricated() 那么它将使用页面中加载的最后一个定义的 jQuery。 现在,如果你使用一个插件,它只适用于旧的 jQuery,并且在内部
    它只使用jQuery 别名(而不是$)编写,然后它会中断。

    如果你真的想使用 2 个不同版本的 jQuery 脚本,你可以这样做
    搜索并替换其中一个上的“jQuery”名称,并将其更改为其他名称, 那么如果你愿意,你也可以通过无冲突方法重新分配它做任何别名。

    【讨论】:

      【解决方案4】:

      作为 EndangeredMassa 解决方案的扩展,我提出如下修改:

      <script type="text/javascript" src="jquery-1.1.3.js"></script>
      <script type="text/javascript" src="jquery-1.4.2.js"></script>
      <script type="text/javascript">
          //Here, $ refers to the most recent jquery script loaded, which is version 1.4.2.
          $.noConflict();
      
          //Here, jQuery refers to 1.4.2 and $ refers to 1.1.3
          //You can setup an alias like so:
          var $NEW = jQuery;
      
          // jQuery needs to refer to 1.1.3 again and not to 1.4.2
          var jQuery = $;
      
          //Now, you can use old jQuery with $ and new jQuery with $NEW.
      </script>
      

      【讨论】:

        【解决方案5】:

        修复旧代码以使用最新的 jQuery 版本。 其他一切都非常骇人听闻,并且会激怒所有将来可能不得不使用您的代码的开发人员。

        【讨论】:

        • 我希望我能“修复”旧代码,但它是由第三方编写的,该第三方签约更新我们的网站,只要它没有完全损坏,公司不会花时间升级网站。他们有时会中断业务。
        猜你喜欢
        • 2010-12-06
        • 2017-01-04
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        相关资源
        最近更新 更多