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

时间:2009-10-14 14:22:48

标签: javascript jquery iframe

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

问题是某些客户可能已经安装了旧版本的jQuery。虽然这可能有用,如果它至少是一个相当新的版本,我们的代码确实依赖于jQuery库中最近引入的一些功能,所以当客户的jQuery版本太旧时必然存在这样的实例。我们不能要求他们升级到最新版本的jQuery。

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

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

7 个答案:

答案 0 :(得分:541)

是的,由于jQuery的noconflict模式,这是可行的。 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();jQuery_1_1_3('#selector').function();

答案 1 :(得分:79)

在查看并尝试之后,我发现它实际上不允许一次运行多个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();
        });
    });

答案 2 :(得分:33)

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

  • 原始页面加载了他的“jquery.versionX.js” - $jQuery属于versionX。
  • 您调用“jquery.versionY.js” - 现在$jQuery属于版本Y,加_$_jQuery属于版本X。
  • my_jQuery = jQuery.noConflict(true); - 现在$jQuery属于版本X,_$_jQuery可能为null,my_jQuery为版本Y。

答案 3 :(得分:22)

有可能加载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>

答案 4 :(得分:22)

您可以根据需要在页面上添加任意数量的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> 

DEMO | Source

答案 5 :(得分:5)

我想说你必须始终使用jQuery最新或最新的稳定版本。但是,如果您需要与其他版本一起工作,则可以添加该版本并将$重命名为其他名称。例如

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

如果您使用$撰写内容,请查看此处,您将获得最新版本。但是,如果您需要使用旧版本执行任何操作,请使用$oldjQuery代替$

这是一个例子

$(function(){console.log($.fn.jquery)});
$oldjQuery (function(){console.log($oldjQuery.fn.jquery)})

Demo

答案 6 :(得分:2)

当然,是的,你可以。此链接包含有关如何实现这一目标的详细信息:https://api.jquery.com/jquery.noconflict/