Aynı sayfada jQuery'nin birden çok sürümünü kullanabilir miyim?


426

Üzerinde çalıştığım bir proje, müşterilerin Web sayfalarında jQuery kullanılmasını gerektiriyor. Müşteriler, oluşturacağımız <script>bir parçacığı oluşturulmuş bir widget oluşturan birkaç öğe içeren bir kod kodu <script>ekleyeceklerdir <iframe>. Zaten jQuery'nin en son sürümünü kullanmıyorlarsa, bu, <script>Google'ın barındırdığı jQuery sürümü için de (büyük olasılıkla) a'yı içerecektir .

Sorun, bazı müşterilerin zaten jQuery'nin eski bir sürümünün yüklü olması olabilir. Bu, en azından oldukça yeni bir sürümse işe yarayabilir, ancak kodumuz jQuery kitaplığında yakın zamanda tanıtılan bazı işlevlere dayanır, bu nedenle bir müşterinin jQuery sürümünün çok eski olduğu durumlar olabilir. JQuery'nin en son sürümüne yükseltmelerini isteyemeyiz.

JQuery'nin yalnızca kodumuz bağlamında, müşterinin sayfasındaki herhangi bir kodu etkilemeyecek veya etkilemeyecek daha yeni bir sürümünü yüklemenin bir yolu var mı? İdeal olarak, belki jQuery varlığını kontrol edebilir, sürümü tespit edebilir ve çok eski ise, bir şekilde sadece kodumuz için kullanmak için en son sürümü yükleyebiliriz.

JQuery'yi <iframe>de içeren bir müşterinin etki alanına yükleme fikrimiz vardı, bu da <script>uygun olabilir gibi görünüyor, ancak bunu yapmanın daha zarif bir yolu olduğunu umuyorum (performans ve karmaşıklık cezaları olmadan bahsetmiyorum) ekstralar <iframe>).



1
Ben de aynı problemle karşılaştım. Katıştırılmış komut dosyamda yalnızca birkaç kez jQuery kullandığım için jQuery'den tamamen vazgeçmeye ve basitçe doğrudan JavaScript'te ihtiyacım olanı yapmaya karar verdim. Bu site: youmightnotneedjquery.com son derece kullanışlıdır.
Ferruccio

Yanıtlar:


578

Evet, jQuery'nin uyumsuz modu nedeniyle yapılabilir. 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>

Sonra, yerine, ya $('#selector').function();yaparsınız .jQuery_1_3_2('#selector').function();jQuery_1_1_3('#selector').function();


13
Çok teşekkürler, ceejayoz! Bu geçerli bir çözüm gibi görünüyor - tek potansiyel sorun kod çözümünüzün (jQuery eski sürümünü farklı bir diğer adı atama) ilk kısmı üzerinde herhangi bir denetim yok olmasıdır. Müşterinin jQuery'yi nasıl kullandığı değişecektir ve kontrolüm dışındadır. Sadece ikinci yarısını güvenle kullanabilir miyim, yoksa her iki kütüphanenin de noConflict () öğesini çağırması gerekiyor mu?
Bungle

7
Evet, sadece ikinci yarıyı kullanabilmelisiniz.
ceejayoz

9
Bu orijinal sayfaya gerçekten şeffaf mı? Bu kod parçasından sonra $ veya jQuery kullanırlarsa , bu kendi jQuery sürümüne veya daha yenisine (muhtemelen daha az eklenti yüklüdür) atıfta bulunur mu?
Wim

2
@ceejayoz, içinde çok fazla $ kullanan, kendini çağırma işlevine sahipseniz ne olur? Her bir $ 'ı, bu sorunlu bölüm içinde jquery_1_3_2 olarak değiştirmeliyiz ???
klewis

37
@blachawk Hayır, sadece takma ad. (function($) { /*your code here*/ }(jquery_x_x_x));
Fabrício Mat

85

Buna baktıktan ve denedikten sonra, aslında bir kerede birden fazla jquery örneğinin çalışmasına izin vermediğini gördüm. Etrafta aradıktan sonra bu sadece hile yaptı ve çok daha az kod olduğunu buldum.

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

Sonra "j" sonra "j" ekleyerek tüm yapmanız gereken oldu.

$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
Pek çok yerde jquery değişkenini yeniden adlandırmaktan kaçınmak için, eski kodunuzu aşağıdakiler içine alabilirsiniz:(function($){ })($j)
Marinos An

36

Http://forum.jquery.com/topic/multiple-versions-of-jquery-on-the-same-page adresinden alınmıştır :

  • - onun "jquery.versionX.js" Orijinal sayfa yükler $ve jQueryversionX aittir.
  • Siz şimdi "jquery.versionY.js" olarak adlandırıyorsunuz - şimdi $ve jQueryY sürümüne, artı _$ve _jQuerysürümX'e aitsiniz.
  • my_jQuery = jQuery.noConflict(true);- şimdi $ve jQueryversionX'e ait _$ve _jQuerymuhtemelen null ve my_jQueryversionY.

9
Bağlantıya gidene kadar anlamadım. "JQuery.xxjs'nizi yüklediğinizde, mevcut $ ve jQuery değişkenlerinin üzerine yazılır ... AMA bunların bir yedek kopyasını tutar (_ $ ve _jQuery'de). NoConflict (true) çağrıldığında durumu önceki gibi geri yüklersiniz dahil et "
Colin


Gelecekte, lütfen harici kaynaklara referans verme konusunda daha açık olun. Daha fazla bilgi için bkz. Stackoverflow.com/help/referencing
Matt

23

Sayfanızda istediğiniz kadar farklı jQuery sürümüne sahip olabilirsiniz.

Kullanım 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 | Kaynak


23

JQuery'nin ikinci sürümünü yüklemek ve daha sonra orijinaline geri yüklemek veya daha önce yüklenmiş bir jQuery yoksa ikinci sürümü korumak mümkündür. İşte bir örnek:

<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

Her zaman jQuery en son veya son kararlı sürümlerini kullanmanız gerektiğini söylemek istiyorum. Ancak, diğer sürümlerle bazı işler yapmanız gerekiyorsa, o sürümü ekleyebilir ve $başka bir adla yeniden adlandırabilirsiniz . Örneğin

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

Eğer kullanarak bir şey yazarsanız buraya bakın $o zaman en son sürümü alırsınız. Ama eski ile bir şey yapmanız gerekiyorsa, sadece $oldjQueryyerine kullanın $.

İşte bir örnek

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

gösteri


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.