Posso usare più versioni di jQuery sulla stessa pagina?


428

Un progetto a cui sto lavorando richiede l'uso di jQuery sulle pagine Web dei clienti. I clienti inseriranno un pezzo di codice che forniremo che include alcuni <script>elementi che creano un widget in un <script>-created <iframe>. Se non stanno già utilizzando l'ultima versione di jQuery, includerà anche (molto probabilmente) una <script>versione di jQuery ospitata da Google.

Il problema è che alcuni clienti potrebbero già avere una versione precedente di jQuery installata. Anche se questo può funzionare se è almeno una versione abbastanza recente, il nostro codice si basa su alcune funzionalità introdotte di recente nella libreria jQuery, quindi ci sono casi in cui la versione jQuery di un cliente è troppo vecchia. Non possiamo richiedere che eseguano l'aggiornamento all'ultima versione di jQuery.

Esiste un modo per caricare una versione più recente di jQuery da utilizzare solo nel contesto del nostro codice, che non interferirà o influenzerà alcun codice sulla pagina del cliente? Idealmente, forse potremmo verificare la presenza di jQuery, rilevare la versione e, se è troppo vecchia, in qualche modo caricare la versione più recente solo per usarla per il nostro codice.

Ho avuto l'idea di caricare jQuery in un <iframe>dominio del cliente che includa anche il nostro <script>, il che sembra essere fattibile, ma spero che ci sia un modo più elegante per farlo (per non parlare senza le prestazioni e le penalità di complessità di extra <iframe>).



1
Ho riscontrato lo stesso problema. Dato che ho usato jQuery solo poche volte nel mio script incorporato, ho deciso di rinunciare del tutto a jQuery e fare semplicemente ciò di cui avevo bisogno direttamente in JavaScript. Questo sito: youmightnotneedjquery.com è stato estremamente utile.
Ferruccio,

Risposte:


578

Sì, è possibile grazie alla modalità noconflict di 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>

Quindi, invece di $('#selector').function();, lo faresti jQuery_1_3_2('#selector').function();o jQuery_1_1_3('#selector').function();.


13
Grazie mille, ceejayoz! Sembra una soluzione praticabile - l'unico potenziale problema è che non ho alcun controllo sulla prima parte della soluzione di codice (assegnando la versione precedente di jQuery a un diverso alias). Il modo in cui il cliente utilizza jQuery varierà ed è al di fuori del mio controllo. Posso tranquillamente usare la seconda metà o entrambe le librerie devono chiamare noConflict ()?
Bungle,

7
Sì, dovresti essere in grado di utilizzare solo la seconda metà.
Ceejayoz,

9
È davvero trasparente alla pagina originale? Se usano $ o jQuery dopo questo pezzo di codice, questo si riferirebbe alla propria versione di jQuery o a quella più recente (che probabilmente ha meno plugin installati)?
Wim,

2
@ceejayoz, cosa succede se hai una funzione auto-invocante che usa molti $ al suo interno. Dovremmo cambiare ogni singolo $ in jquery_1_3_2, all'interno di quella sezione noconflict ???
Klewis,

37
@blachawk No, alias. (function($) { /*your code here*/ }(jquery_x_x_x));
Fabrício Matté,

85

Dopo aver esaminato questo e averlo provato, ho scoperto che in realtà non consentiva l'esecuzione di più di un'istanza di jquery alla volta. Dopo aver cercato in giro, ho scoperto che questo ha fatto il trucco ed era molto meno codice.

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

Quindi, aggiungere "j" dopo "$" era tutto ciò che dovevo fare.

$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();
        });
    });

6
Per evitare di rinominare la variabile jquery in così tanti posti potresti semplicemente racchiudere il tuo vecchio codice all'interno di quanto segue:(function($){ })($j)
Marinos Il

36

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

  • La pagina originale carica il suo "jquery.versionX.js" - $e jQueryappartiene alla versioneX.
  • Chiami il tuo "jquery.versionY.js" - ora $e jQueryappartieni a versionY, più _$e _jQueryappartengono a versionX.
  • my_jQuery = jQuery.noConflict(true);- ora $e jQueryappartengono a versionX, _$e _jQuerysono probabilmente nulli, ed my_jQueryè versionY.

9
Non ho capito fino a quando non sono andato al collegamento. "Quando carichi jQuery.xxjs, sovrascriverà le variabili $ e jQuery esistenti ... MA ne conserva una copia di backup (in _ $ e _jQuery). Chiamando noConflict (true) ripristini la situazione com'era prima la tua inclusione js "
Colin,


In futuro, sii più esplicito riguardo al riferimento a fonti esterne. Per ulteriori informazioni, consultare stackoverflow.com/help/referencing
Matt

23

Puoi avere tutte le diverse versioni di jQuery sulla tua pagina che desideri.

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


23

È possibile caricare la seconda versione di jQuery usarlo e quindi ripristinare l'originale o mantenere la seconda versione se non era stato caricato prima jQuery. Ecco un esempio:

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

5

Vorrei dire che è necessario utilizzare sempre le versioni stabili più recenti o recenti di jQuery. Tuttavia, se è necessario eseguire alcune operazioni con altre versioni, è possibile aggiungere quella versione e rinominarla $con un altro nome. Per esempio

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

Guarda qui se scrivi qualcosa usando $, otterrai l'ultima versione. Ma se hai bisogno di fare qualcosa con il vecchio, usa semplicemente $oldjQueryinvece di $.

Ecco un esempio

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

dimostrazione


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.