我可以在同一页面上使用多个版本的 jQuery 吗?

IT技术 javascript jquery iframe
2020-12-22 16:45:44

我正在处理的一个项目需要在客户的网页上使用 jQuery。客户将插入我们将提供的一段代码,其中包括一些<script><script>-created中构建小部件的元素<iframe>如果他们还没有使用最新版本的 jQuery,这也将包括(很可能)<script>Google 托管的 jQuery 版本。

问题是一些客户可能已经安装了旧版本的 jQuery。虽然如果它至少是一个相当新的版本,这可能会起作用,但我们的代码确实依赖于 jQuery 库中最近引入的一些功能,因此肯定会出现客户的 jQuery 版本太旧的情况。我们不能要求他们升级到最新版本的 jQuery。

有什么方法可以加载较新版本的 jQuery 以仅在我们的代码上下文中使用,而不会干扰或影响客户页面上的任何代码?理想情况下,也许我们可以检查 jQuery 是否存在,检测版本,如果它太旧,然后以某种方式加载最新版本以用于我们的代码。

我有<iframe>在客户域中加载 jQuery 的想法<script>,其中还包括我们的,这似乎是可行的,但我希望有一种更优雅的方法来做到这一点(更不用说没有性能和复杂性的惩罚额外的<iframe>s)。

6个回答

是的,由于 jQuery 的无冲突模式,这是可行的。http://blog.nemikor.com/2009/10/03/using-multiple-versions-of-jquery/

<!-- load jQuery 1.1.3 -->
<script type="text/javascript" src="http://example.com/jquery-1.1.3.js"></script>
<script type="text/javascript">
var jQuery_1_1_3 = $.noConflict(true);
</script>

<!-- load jQuery 1.3.2 -->
<script type="text/javascript" src="http://example.com/jquery-1.3.2.js"></script>
<script type="text/javascript">
var jQuery_1_3_2 = $.noConflict(true);
</script>

然后,而不是$('#selector').function();,你会做jQuery_1_3_2('#selector').function();or jQuery_1_1_3('#selector').function();

这对原始页面真的透明吗?如果他们这段代码之后使用 $ 或 jQuery ,这是指他们自己的 jQuery 版本还是更新的版本(可能安装的插件较少)?
2021-02-12 16:45:44
@ceejayoz,如果您有一个在其中使用大量 $ 的自调用函数,会发生什么。我们必须在 noconflict 部分中将每个 $ 更改为 jquery_1_3_2 ???
2021-02-15 16:45:44
是的,您应该可以只使用后半部分。
2021-02-19 16:45:44
非常感谢,ceejayoz!这看起来是一个可行的解决方案 - 唯一的潜在问题是我无法控制代码解决方案的第一部分(将旧版本的 jQuery 分配给不同的别名)。客户使用 jQuery 的方式会有所不同,这超出了我的控制范围。我可以安全地只使用后半部分,还是两个库都需要调用 noConflict()?
2021-03-01 16:45:44
@blachawk 不,只是别名。 (function($) { /*your code here*/ }(jquery_x_x_x));
2021-03-04 16:45:44

在查看并尝试之后,我发现它实际上不允许一次运行多个 jquery 实例。在四处搜索后,我发现这确实有效,而且代码少了很多。

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
    <script>var $j = jQuery.noConflict(true);</script>
    <script>
      $(document).ready(function(){
       console.log($().jquery); // This prints v1.4.2
       console.log($j().jquery); // This prints v1.9.1
      });
   </script>

所以然后在“$”之后添加“j”就是我需要做的。

$j(function () {
        $j('.button-pro').on('click', function () {
            var el = $('#cnt' + this.id.replace('btn', ''));
            $j('#contentnew > div').not(el).animate({
                height: "toggle",
                opacity: "toggle"
            }, 100).hide();
            el.toggle();
        });
    });
为了避免在很多地方重命名 jquery 变量,您可以将旧代码包含在以下内容中: (function($){ })($j)
2021-02-12 16:45:44

取自http://forum.jquery.com/topic/multiple-versions-of-jquery-on-the-same-page

  • 原始页面加载自己的“jquery.versionX.js” -$jQuery属于versionX。
  • 现在-你打电话给你“jquery.versionY.js”$jQuery属于versionY,再加上_$_jQuery属于versionX。
  • my_jQuery = jQuery.noConflict(true);-现在$jQuery属于versionX,_$并且_jQuery可能是空的,my_jQuery是versionY。
将来,请更明确地引用外部资源。有关更多信息,请参阅stackoverflow.com/help/referencing
2021-03-03 16:45:44
我不明白,直到我去链接。“当你加载你的 jQuery.xxjs 时,它会覆盖现有的 $ 和 jQuery 变量......但它会保留它们的备份副本(在 _$ 和 _jQuery 中)。调用 noConflict(true) 你可以恢复之前的情况你的js包含”
2021-03-05 16:45:44

如果之前没有加载 jQuery,可以加载第二个版本的 jQuery 使用它,然后恢复到原始版本或保留第二个版本。下面是一个例子:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript">
    var jQueryTemp = jQuery.noConflict(true);
    var jQueryOriginal = jQuery || jQueryTemp;
    if (window.jQuery){
        console.log('Original jQuery: ', jQuery.fn.jquery);
        console.log('Second jQuery: ', jQueryTemp.fn.jquery);
    }
    window.jQuery = window.$ = jQueryTemp;
</script>
<script type="text/javascript">
    console.log('Script using second: ', jQuery.fn.jquery);
</script>
<script type="text/javascript">
    // Restore original jQuery:
    window.jQuery = window.$ = jQueryOriginal;
    console.log('Script using original or the only version: ', jQuery.fn.jquery);
</script>

您可以根据需要在页面上拥有任意多个不同的 jQuery 版本。

使用jQuery.noConflict()

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script>
    var $i = jQuery.noConflict();
    alert($i.fn.jquery);
</script> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    var $j = jQuery.noConflict();
    alert($j.fn.jquery);
</script> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
    var $k = jQuery.noConflict();
    alert($k.fn.jquery);
</script> 

演示| 来源