【问题标题】:Using different versions of jQuery and jQueryUI together一起使用不同版本的 jQuery 和 jQueryUI
【发布时间】:2010-11-18 12:06:31
【问题描述】:

我正在做一个项目,他们的框架使用 jQuery 1.3.2 和 jQueryUI 1.7.2。

升级框架中的版本是不可能的,所以我想并行运行 jQuery 1.4.4 和 jQueryUI 1.8.5。

我已经看到不同版本的 jQuery 可以像这样并行使用:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>  
    <script type="text/javascript">
        var j$132 = $.noConflict(true);
    </script>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script type="text/javascript">
        var j$144 = $.noConflict(true);
    </script>

但这也适用于以下情况:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script> 
    <script type="text/javascript">
        var j$132 = $.noConflict(true);
    </script>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js"></script>
    <script type="text/javascript">
        var j$144 = $.noConflict(true);
    </script>

【问题讨论】:

  • 第二个代码块确实适用于 CDN 源,是的,并且依赖于在加载第二个版本之前清除对 jQuery 的引用这一事实。它等同于接受的答案。
  • 所以 jqueryui v1.7.2 将使用 j$132 而 jqyeryui v1.8.5 将使用 j$144?对不起,如果这是一个愚蠢的问题

标签: jquery jquery-ui


【解决方案1】:

AFAIK,没有 $.noConflict() 等效于 jQuery UI。但是,您可以使用 jQuery UI 的本地副本并使用与为不同库设置别名类似的技巧来包装整个 JS:

(function(jQuery) {
  // ... the jQuery UI lib code for jQuery 1.3.2
})(j$132);

这可以使用服务器端构建脚本或处理 JS 文件但使用上述代码包装内容的处理程序来优雅地实现。

尚未测试此方法,因此您可能不得不摆弄函数参数(尽管我认为可以安全地假设它使用jQuery 在插件代码中引用 jQuery)。

您使用它的方式是声明两个版本的 jQuery:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>  
<script type="text/javascript">
    var j$132 = $.noConflict(true);
</script>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript">
    var j$144 = $.noConflict(true);
</script>

...然后包含您的 UI 代码,正如我在上面指定的那样。

不,您不能在从 Google CDN 引用 UI JS 文件时执行此操作。

编辑: 问题中的第二个代码块实际上是比这个答案更好的解决方案,因为它不需要将原始 UI 代码包装在自执行函数中并传递特定版本.两种方法都会在页面上产生完全相同的状态。

【讨论】:

  • 这完全违背了包装器的目的,即在调用jQuery.noConflict(true)之前捕获对jQuery的引用。 jQuery UI 旨在开箱即用地支持这一点。问题中建议的实现实际上是正确的并且工作得很好。
  • 所以 jqueryui v1.7.2 将使用 j$132 而 jqyeryui v1.8.5 将使用 j$144?对不起,如果这是一个愚蠢的问题
【解决方案2】:

我进入此页面是因为我遇到了与原始问题中描述的相同的问题,但给出的答案并没有完全解决它(不再)。

我需要使用 jquery 向包含大量现有代码的页面添加自动建议,没有简单的方法来更新到新的 jquery 和 jquery ui,因此尝试在旧版本旁边使用新版本.

除了编辑 jqueryui 最后一行之外,jquery ui 还有很多需要更改的 jQuery 引用,所以我使用了一个可以使用正则表达式替换并替换的编辑器: \bjQuery\b 和 j$182

在我添加的页面中:

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        var j$182 = $.noConflict(true);
        </script>
<script type="text/javascript" src="jqueryui1.9.0.js"></script>

现在页面上的现有脚本和新的自动建议都可以工作了。

【讨论】:

    【解决方案3】:

    我刚刚想出了一个解决方案,它对我有用。

    在 Jquery 库中,在最后一行类型之后

    var mySelector = $;
    

    在您的页面中包含此版本后,请包含其他版本。

    现在,在您想与此 jquery 版本一起使用的所有脚本中(甚至 jquery ui 和其他库也是如此),将 $ 替换为 mySelector。使用 replaceall,会有几个地方,比如在正则表达式匹配函数中,您希望将 mySelector 替换回 $。这个问题困扰了我很长时间。它刚刚得到解决。

    已编辑:确保不要替换 jQuery 原始脚本中的任何 $。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 2023-03-09
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多