2009-10-14 6 views
351

Projekt, nad którym pracuję, wymaga użycia jQuery na stronach internetowych klientów. Klienci wstawią fragment kodu, który dostarczymy, zawierający kilka elementów <script>, które budują widżet w <script> -utworzonym . Jeśli nie używają najnowszej wersji jQuery, będzie to również (najprawdopodobniej) wersja <script> dla hostowanej wersji jQuery Google.Czy mogę korzystać z wielu wersji jQuery na tej samej stronie?

Problem polega na tym, że niektórzy klienci mogą mieć już starszą wersję jQuery. Chociaż może to działać, jeśli jest to przynajmniej dość aktualna wersja, nasz kod opiera się na niedawno wprowadzonej funkcjonalności w bibliotece jQuery, więc istnieją przypadki, gdy wersja jQuery klienta jest zbyt stara. Nie możemy wymagać aktualizacji do najnowszej wersji jQuery.

Czy istnieje sposób na załadowanie nowszej wersji jQuery do użycia tylko w kontekście naszego kodu, który nie będzie zakłócać ani wpływać na jakikolwiek kod na stronie klienta? Idealnie, może moglibyśmy sprawdzić obecność jQuery, wykryć wersję, a jeśli jest za stara, to jakoś załadować najnowszą wersję, aby użyć jej do naszego kodu.

Wpadłem na pomysł załadowania jQuery do domeny w domenie klienta, która obejmuje również naszą <script>, co wydaje się być wykonalne, ale mam nadzieję, że jest bardziej elegancki sposób na to (nie wspominając bez kary za wydajność i złożoność dodatkowych s.).

+5

[Poniżej znajduje się szczegółowy post na noConflict() i korzystanie z wielu bibliotek jQuery] (http://conceptf1.blogspot.com/2013/12/conflict-in-multiple-jquery-files-on-same-page.html) –

+1

Wpadłem na ten sam problem. Ponieważ w moim osadzonym skrypcie użyłem jQuery tylko kilka razy, postanowiłem całkowicie zrezygnować z jQuery i po prostu zrobić to, czego potrzebowałem bezpośrednio w JavaScript. Ta strona: http://youmightnotneedjquery.com/ była niezwykle przydatna. – Ferruccio

Odpowiedz

480

Tak, jest to możliwe ze względu na tryb noconflict 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> 

Następnie zamiast $('#selector').function();, że zrobisz jQuery_1_3_2('#selector').function(); lub jQuery_1_1_3('#selector').function();.

+10

Dziękuję bardzo, ceejayoz! To wygląda na sensowne rozwiązanie - jedynym potencjalnym problemem jest to, że nie mam żadnej kontroli nad pierwszą częścią twojego rozwiązania kodu (przypisanie starszej wersji jQuery do innego aliasu). Sposób, w jaki klient korzysta z jQuery, będzie różnił się i będzie poza moją kontrolą. Czy mogę bezpiecznie użyć drugiej połówki, czy też obie biblioteki muszą wywołać funkcję noConflict()? – Bungle

+7

Tak, powinieneś być w stanie użyć drugiej połowy. – ceejayoz

+9

Czy to jest naprawdę przezroczyste dla strony oryginalnej? Jeśli używają $ lub jQuery * po * tym fragmencie kodu, czy będzie to dotyczyło ich własnej wersji jQuery lub nowszej (która prawdopodobnie ma mniej zainstalowanych wtyczek)? – Wim

26

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

  • Oryginalna strona ładuje swoje "jquery.versionX.js" - $ i jQuery należą do versionX.
  • Nazywasz swoje "jquery.versionY.js" - teraz $ i jQuery należą do wersjiY, plus _$ i _jQuery należą do wersjiX.
  • my_jQuery = jQuery.noConflict(true); - teraz $ i jQuery należą do versionX, _$ i _jQuery prawdopodobnie null, a my_jQuery jest versionY.
+7

Nie zrozumiałem, dopóki nie poszedłem do linku. "Po załadowaniu jQuery.xxjs, nadpisze istniejące zmienne $ i jQuery ... ALE zachowuje ich kopię zapasową (w _ $ i _jQuery) Wywołanie noConflict (true) przywraca sytuację tak, jak to było przed twoim włączeniem js " – Colin

+2

[Tutaj jest szczegółowy wpis na noConflict() i używanie wielu bibliotek jQuery] (http://conceptf1.blogspot.com/2013/12/conflict-in-multiple-jquery-files-on-same -page.html) –

+0

W przyszłości wyraźniej mów o źródłach zewnętrznych. Aby uzyskać więcej informacji, zobacz http://stackoverflow.com/help/referencing – Matt

17

Możliwe jest załadowanie drugiej wersji jQuery, a następnie przywrócenie oryginału lub zachowanie drugiej wersji, jeśli wcześniej nie załadowano jQuery. Oto przykład:

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

Po obejrzeniu tego i próbuje ją znalazłem to faktycznie nie pozwala więcej niż jedna instancja jQuery uruchomić jednocześnie. Po przeszukiwaniu stwierdziłem, że to wystarczyło i było o wiele mniej kodu.

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

Więc dodanie "j" po "$" było wszystko, co potrzebne do zrobienia.

18

Możesz mieć tyle różnych wersji jQuery na swojej stronie, ile chcesz.

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

| Source

2

Chciałbym powiedzieć, że zawsze należy używać najnowszych lub najnowszych stabilnych wersji jQuery. Jeśli jednak chcesz wykonać pewne prace z innymi wersjami, możesz dodać tę wersję i zmienić nazwę na $ na inną nazwę. Na przykład

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

Zajrzyj tutaj, jeśli coś napisać korzystając $ wtedy dostaniesz najnowszą wersję. Ale jeśli chcesz zrobić coś ze starym, po prostu użyj $oldjQuery zamiast $.

Oto przykład

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

Demo

Powiązane problemy