2009-02-09 15 views
66

Moja firma zakupiła produkt, który renderuje kontrolkę ASP.NET na stronie. Ta kontrolka używa jQuery 1.2.3 i dodaje do niej tag skryptu, aby się do niej odwoływać. Twórcy kontroli nie będą obsługiwać formantu, jeśli zostanie on zmodyfikowany w jakikolwiek sposób (w tym modyfikacja odnosząca się do innej wersji jQuery).Jak uruchomić różne wersje jQuery na tej samej stronie?

Mam zamiar rozpocząć rozwój własnej kontroli i chciałbym skorzystać z funkcji i ulepszeń prędkości jQuery 1.3. Obie te kontrolki będą musiały istnieć na tej samej stronie.

Jak mogę zezwolić zakupionej formantowi na użycie jQuery 1.2.3 i nowego niestandardowego programowania do użycia jQuery 1.3? Również z ciekawości, co by było, gdybyśmy używali dodatkowej kontroli, która wymagałaby odniesienia się do innej wersji jQuery?

+1

Czy autor autor kontroli nie zwalnia aktualizacji? A może nowsza wersja jest niekompatybilna? To bardzo dziwne, że komercyjny sprzedawca kontroli zewnętrznej utworzył kontrolkę, która jest zakodowana na stałe do konkretnej wersji javascriptu o otwartym kodzie źródłowym, która jest często aktualizowana. – BlackMael

+0

Nie widzę, jak nie są wkręcane, jeśli używasz wielu kontrolek serwera, które wymagają stałych wersji jQuery. – BlackMael

+1

Nie każdy autor wtyczki skrupulatnie aktualizuje/potrafi regularnie aktualizować swój kod. Ja też stanąłem przed tym problemem, ale potem przełączyłem się na często aktualizowany ekwiwalent społecznościowy. –

Odpowiedz

99

Możesz to osiągnąć, uruchamiając swoją wersję jQuery w no-conflict mode. Tryb "Brak konfliktu" jest typowym rozwiązaniem, które pozwala jQuery pracować na stronie z innymi frameworkami, takimi jak prototype, i może być również używany tutaj, ponieważ zasadniczo tworzy przestrzeń nazw dla każdej wersji jQuery, którą ładujesz.

<script src="jQuery1.3.js"></script> 
<script> 
    jq13 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

Ta zmiana będzie oznaczać, że każda z tych rzeczy jQuery chcesz używać będą musiały być nazywane przy użyciu jq13 zamiast $, np

jq13("#id").hide(); 

Nie jest to idealna sytuacja, aby mieć dwie wersje działające na tej samej stronie, ale jeśli nie masz alternatywę, to powyższe metody powinno pozwolić na użycie dwóch wersjach różniących się od razu.

się także z ciekawości, co gdybyśmy byli do korzystania z dodatkowej kontroli że potrzebne do odniesienia kolejną wersję jQuery?

Jeśli potrzebne, aby dodać kolejną wersję jQuery, można poszerzyć o powyższe:

<script src="jQuery1.3.js"></script> 
<script> 
    jq13 = jQuery.noConflict(true); 
</script> 
<script src="jQuery1.3.1.js"></script> 
<script> 
    jq131 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

Zmienne jq13 i jq131 by każdy może być wykorzystywane do funkcji Version specyficzne wymagają.

To ważne, że jQuery stosowane przez oryginalnego dewelopera jest ładowany ostatni - oryginalny deweloper prawdopodobnie napisał swój kod przy założeniu, że $() byłoby wykorzystując swoją wersję jQuery. Jeśli załadujesz inną wersję po ich, $ zostanie "złapany" przez ostatnią załadowaną wersję, co oznaczałoby kod oryginalnego dewelopera działający w najnowszej wersji biblioteki, czyniąc noConflicts nieco zbędnym!

+11

Czy zamówienie jest naprawdę ważne? Czy cały punkt funkcji noConflict nie zwraca zmiennej "$" pierwotnemu właścicielowi? Zamawianie nie powinno być ważne. Ważne jest jednak to, że jQuery.noConflict jest nazywane ** natychmiastowo ** po wczytaniu wersji jQuery, która powinna przejść do trybu bez konfliktów. – mtyaka

+4

mtyaka ma dokładnie rację. Jeśli przekażesz parametr "true", nie musisz się martwić kolejnością, w której ładujesz skrypty. Przejście w "prawda" na noconflict przywraca zmienną "jQuery" i zmienną "$" do tego, czym były. Bez tego przywracane jest tylko "$". – Muhd

2

Wygląda na to, że zamówienie nie ma znaczenia ... na przykład: http://gist.github.com/136686. Wyjście konsoli jest na górze, a wszystkie wersje wydają się znajdować we właściwych miejscach.

24

Jak powiedział ConroyP, możesz to zrobić z jQuery.noConflict, ale nie zapominaj o var podczas deklarowania zmiennej. Podoba mi się to.

<script src="jQuery1.3.js"></script> 
<script> 
    var jq13 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

można podłączyć wszystkie $ 's do jq13 dodając (jq13) po funkcja na }).w ten sposób

(function($) { 
... 
})(jq13); 
+5

Nie posiadanie var nie jest tutaj wielką sprawą. Zmienne zdefiniowane bez var mają zasięg globalny. ** chcesz **, aby obiekt jq13 miał zasięg globalny. –

+3

Niejawne globale to zła praktyka kodowania. Jeśli jesteś pewien, że chcesz zmiennej globalnej, powinieneś zadeklarować ją w globalnym zasięgu za pomocą słowa kluczowego var, lub przypisz zmienną do obiektu okna ręcznie, jeśli znajduje się wewnątrz funkcji. Zobacz http://javascript.crockford.com/code.html#variable%20declarations – Muhd

0

W drugiej wersji zadeklaruj zmienną jako $ .noConflict (true). I użyj zadeklarowanej zmiennej w miejsce $ używanego w kodzie jquery. Proszę sprawdzić poniższy kod: Ten kod jest używany po ogłoszeniu drugiej wersji jQuery:

<script type="text/javascript"> 
var jQuery_1_9_1 = $.noConflict(true); function pageLoad(sender, args) { 

     var $ddl = jQuery_1_9_1("select[name$=drpClassCode]"); 
     var $ddl1 = jQuery_1_9_1("select[name$=drpSubContractors]"); 
     $ddl.select2(); 
     $ddl1.select2(); 

     $ddl.bind("change keyup", function() { 
      $ddl.fadeIn("slow"); 


     }); 

     $ddl.bind("change keyup", function() { 
      $ddl1.fadeIn("slow"); 


     }); 
    } 
1

czynią to fałszywy pracować

var jq16 = $.noConflict(false); 
Powiązane problemy