Puis-je utiliser plusieurs versions de jQuery sur la même page?

Un projet sur lequel je travaille nécessite l'utilisation de jQuery sur les pages Web des clients. Les clients inséreront un morceau de code que nous fournirons qui inclut quelques éléments <script> qui construisent un widget dans un <script> <iframe> créé par <script>. S'ils n'utilisent pas déjà la dernière version de jQuery, cela inclura également (très probablement) un <script> pour la version hébergée de Google de jQuery.

Le problème est que certains clients peuvent déjà avoir une ancienne version de jQuery installée. Bien que cela puisse fonctionner si c'est à moins une version assez récente, notre code repose sur certaines fonctionnalités récemment introduites dans la bibliothèque jQuery, donc il y a forcément des cas où la version jQuery d'un client est trop ancienne. Nous ne pouvons pas exiger qu'ils mettent à niveau vers la dernière version de jQuery.

Existe-t-il un moyen de charger une version plus récente de jQuery à utiliser uniquement dans le contexte de notre code, qui n'interférera ni n'affectera aucun code sur la page du client? Idéalement, peut-être que nous pourrions vérifier la présence de jQuery, détecter la version, et si elle est trop ancienne, puis Charger en quelque sorte la version la plus récente juste à utiliser pour notre code.

J'ai eu l'idée de charger jQuery dans un <iframe> dans le domaine du client qui inclut également notre <script>, ce qui semble être faisable, mais j'espère qu'il y a une façon plus élégante de le faire (sans parler des pénalités de performance et de complexité de extra <iframe>s).

380
demandé sur Tshepang 2009-10-14 18:22:48

7 réponses

Oui, c'est faisable en raison du mode noconflict de 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>

, Puis, au lieu de $('#selector').function();, vous feriez jQuery_1_3_2('#selector').function(); ou jQuery_1_1_3('#selector').function();.

520
répondu ceejayoz 2009-10-14 14:27:11

Après avoir regardé ceci et l'avoir essayé, j'ai trouvé qu'il ne permettait pas à plus d'une instance de jquery de s'exécuter à la fois. Après avoir cherché, j'ai trouvé que cela faisait juste l'affaire et était beaucoup moins de code.

    <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>

Donc, ajouter le " j "après le" $ " était tout ce que j'avais à faire.

$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();
        });
    });
71
répondu Weird Mike 2013-04-09 22:59:21

Prises à partir de http://forum.jquery.com/topic/multiple-versions-of-jquery-on-the-same-page:

  • la page originale charge son " jquery.versionX.js" -- $ et jQuery appartiennent à versionX.
  • vous appelez votre " jquery.versionY.js" -- maintenant $ et jQuery appartiennent à versionY, plus _$ et _jQuery appartiennent à versionX.
  • my_jQuery = jQuery.noConflict(true); -- maintenant $ et jQuery appartiennent à versionX, _$ et _jQuery sont probablement nulle, et my_jQuery est versionY.
29
répondu Juan Vidal 2015-09-01 12:23:23

Vous pouvez avoir autant de versions différentes de jQuery sur votre page que vous le souhaitez.

Utiliser 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> 

DÉMO | Source

21
répondu martynas 2017-05-23 12:10:41

Il est possible de charger la deuxième version du jQuery l'utiliser et ensuite restaurer l'original ou conserver la deuxième version s'il n'y avait pas de jQuery chargé auparavant. Voici un exemple:

<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>
20
répondu Tomas Kirda 2012-11-14 00:03:10

Je voudrais dire que vous devez toujours utiliser les versions stables récentes ou récentes de jQuery. Cependant, si vous devez travailler avec d'autres versions, vous pouvez ajouter cette version et renommer $ à un autre nom. Par exemple

<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>

Regardez ici si vous écrivez quelque chose en utilisant $ alors vous obtiendrez la dernière version. Mais si vous avez besoin de faire quelque chose avec old, utilisez simplement $oldjQuery au lieu de $.

Voici un exemple

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

Démo

4
répondu gdmanandamohon 2017-05-30 08:48:13

Absolument, si vous pouvez. Ce lien contient des détails sur la façon dont vous pouvez y parvenir: https://api.jquery.com/jquery.noconflict/.

1
répondu Jaime Montoya 2017-09-11 23:46:35