2010-07-06 20 views
21

Po prostu nie mogę tego rozwiązać. Mój Boże, boli mnie mój mózg, więc zwracam się do was, dobrych ludzi w Internecie.jQuery: noConflict

Patrzyłem na the documentation for the jQuery $.noConflict() function bez powodzenia.

Mój problem polega na tym, że strona, nad którą pracuję, zawiera już jQuery 1.1.3.1, ale chcę zrobić niesamowitą i snazzy pracę UI w kilku miejscach, więc z oczywistych względów chcę korzystać z 1.4.2.

Próbowałem uruchomić te strony obok siebie, ale nie mogę uzyskać kodu do wykonania. Muszę też zaimplementować kilka wtyczek w wersji 1.4.2, więc nie jestem pewien, czy działanie jQuery na coś podobnego do $j zadziałałoby, ponieważ wtyczki prawdopodobnie pobierałyby $ i jQuery jako 1.1.3.1 zamiast 1.4.2.

Czy istnieje sposób, że mogę zawinąć mój kod w bloku noConflict(), a także dołączyć wtyczki, które są potrzebne do utworzenia samodzielnego bloku kodu 1.4.2?

Każda pomoc byłaby fantastyczna, ponieważ mój biedny umysł płacze pośród rozległych nieużytków, które są dokumentami API!

+2

Whoa ... Może spróbuj przekonać peepów, którzy uruchamiają tę stronę, aby zaktualizować dowolny skrypt, który używa jQuery 1.1.3.1 :) Dużo prostsze rozwiązanie, nie zgadzasz się? :) – Gavrisimo

+1

Rozwiązanie @Gavrisimo jest proste tylko wtedy, gdy da peeps jest proste do przekonania (-: W każdym razie jest to praktyczny i interesujący problem – hippietrail

+0

Szkoda, że ​​mój angielski nie jest wystarczająco dobry dla SO. –

Odpowiedz

6

Powinieneś po prostu zaktualizować całą witrynę do wersji 1.4.2.
jQuery ogólnie nie ma wielu przełomowych zmian, więc nie powinno to być takie trudne.

+2

Chciałbym bardzo miło zrób to, ale oznaczałoby to masywne zmiany w całej witrynie i zastąpienie wielu ajaxów i wtyczek również ... Cały folder aplikacji to 1,22 gb, więc możesz sobie wyobrazić kod bazowy, z którym mam do czynienia! –

+4

Skończyłem na aktualizacji biblioteki i przebudowa js! –

+1

@DavidYell zdecydowanie najlepsze rozwiązanie! – RYFN

0

Solidna porada: nie należy podkreślać swojej i użytkowników przepustowości z dwiema wersjami jQuery. Zmień cały kod źródłowy na najnowszą wersję. Ma mniej błędów, więcej wsparcia i ulepszonego zachowania.

+0

Przepustowość nie jest poważnym problemem, ponieważ będzie buforowana i wszystko, bardziej martwię się o 2 wersje, tak, wiem, zrywając wszystko. –

+1

Oh, mamy tam także 1.2.1! ;) ..i moja baza kodu to 1,22 gb! –

+0

Przepustowość nie jest głównym problemem? TO JEST! Nie możesz liczyć na buforowanie. http: // stackoverflow.com/questions/3111468/speed-performance-reduce-http-requests-or-not/3137112 # 3137112 – galambalazs

3

Powinieneś opublikować przykład, który nie działa. Założę się, że natychmiast to wyjaśnimy.

Nie wierzę, że konflikt nie jest dokładnie "blokiem". Używasz noConflict, aby powiedzieć jQuery, że chcesz usunąć wszystko, co deklaruje z globalnej przestrzeni nazw JavaScript (ponieważ chcesz ponownie załadować jQuery i ponownie użyć tych nazw).

Na stronie z więcej niż 1 wystąpieniem załadowanych jQuery, , oba instancje powinny używać opcji noConflict. Nie wiem, czy możliwe jest załadowanie drugiej instancji jQuery, jeśli jest już załadowana instancja i ta instancja nie wywołała funkcji noConflict.

@SLaks i @galambalazs: Czasami piszesz niewielką ilość treści, które będą wyświetlane na większej stronie, takiej jak portal. Portal korzysta już z (j) przestarzałej wersji jQuery, ale potrzebujesz nowszej wersji. Ponadto nie kontrolujesz większej strony portalu, tylko treść, którą piszesz, która będzie w nim wyświetlana.

Ten scenariusz dokładnie opisuje prawdziwą pracę, którą wykonuję wspólnie.

+0

Spowoduje to różnego rodzaju problemy, ponieważ 'jQuery' jest nazwą obiektu, wtyczki rozszerzają ... co? Ostatni ładowany przed wykonaniem, a każdy ładujący jQuery usuwa wszystkie wtyczki tego wcześniej ... to tylko wierzchołek góry lodowej pod względem problemów, po prostu nie jest to zaprojektowane. –

+1

Zapoznaj się z tym doskonałym zapisem od mojego kolegi: https://isa.its.yale.edu/confluence/display/YIP/jQuery+in+uPortal+3.1 jQuery * jest * przeznaczony do tego. Musisz wczytać wtyczki, które chcesz użyć po załadowaniu samego jQuery, ale * przed * wywołujesz noConflict. Następnie wykonujesz swoją konfigurację strony w anonimowej funkcji, w której instancja jQuery może być przypisana do standardowej zmiennej $ dla prostoty i przejrzystości. –

2

Zgadzam się z innymi wpisami, które sugerują, że próbują uaktualnić do wersji 1.4.2 na całej planszy ... Powiedziałeś, że wyraźnie masz dobry powód, by próbować tego, co próbujesz zrobić. Według mojej wiedzy nie ma łatwego sposobu radzenia sobie z twoją sytuacją (ponieważ ja też próbowałem czegoś podobnego).

"noConflict" po prostu zwalnia globalną zmienną "$", aby inne biblioteki/skrypty mogły z niej bezpiecznie korzystać. Biorąc pod uwagę, że próbujesz użyć dwóch wersji jQuery, "noConflict" nie jest tu zbyt pomocny ...wywoływanie go w obu wersjach jQuery nie zmienia faktu, że obie wersje muszą nadal odwoływać się do globalnego obiektu "jQuery" (z czego może być tylko jeden ...).

Problem (jak już wyraźnie wiadomo) polega na tym, że ładowanie drugiej wersji jQuery spowoduje "oderwanie" oryginalnego obiektu jQuery (i wszystkich "dostosowań" wprowadzonych przez wtyczki).

Jedyny niezawodny (choć bardzo nieefektywne) roztworu mogłem wymyślić jest:

  • Załaduj wersję istniejących (starych) jQuery i wtyczek (zakładając, że nie można tego uniknąć )
  • Załaduj nową wersję jQuery
  • RE-load i istniejących wtyczek i każdy nowy plugin chcesz użyć
  • test obszernie
+0

To mi się nie zdarzyło, ale jest to świetna sugestia. O ile nie mogę przekonać mojego szefa, żeby pozwolił mi wszystko ulepszyć! ;) –

5

Niedawno miałem podobny problem, gdy korzystałem z jQuery v1.3.2 na stronie, ale wyskakujące okienko ankiety z innej strony korzystało ze starszej wersji na tej samej stronie. W końcu udało mi się rozwiązać problem. I odwołuje jQuery 1.3.2 następująco:

<script type="text/javascript" src"/Scripts/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript"> 
     jq132 = jQuery.noConflict(true); 
</script> 

I wtedy cały mój zmodyfikowany kod jQuery używać jq132 zamiast $. Potem znalazłem i zamieniłem na wszystkie wtyczki, których używałem, aby zastąpić "$ (" przez "jq132 (" i "$." Za pomocą "jq132." Może być bardziej eleganckie podejście, ale to działało dla mnie. Jestem daleko od eksperta jQuery, więc może istnieć inna składnia $, którą musisz obsłużyć (tj. Nie tylko "." I "(").).

27

Jeśli masz dwie lub trzy jQuery na tej samej stronie , wystarczy umieścić inną zmienną dla każdego innego jQuery

Przykład:

<script type="text/javascript"> 
    var $s = jQuery.noConflict(); 
    $s(document).ready(function() { 
     $s('#news-container').vTicker({ 
      speed: 500, 
      pause: 3000, 
      animation: 'fade', 
      mousePause: true, 
      showItems: 2 
     }); 
    }); 
</script> 
<script type="text/javascript"> 
    var $j = jQuery.noConflict(); 
    $j(document).ready(function() { 
     $j('.sf-menu ul').superfish({ 
      delay: 1000, 
      animation: { 
       opacity: 'show', 
       height: 'show' 
      }, 
      speed: 'medium', 
      autoArrows: false, 
      dropShadows: 'medium' 
     }); 
    }); 
</script> 
+1

Dzięki za odpowiedź. Naprawdę mi pomógł. –

+2

W moim przypadku, tylko $ s naprawił mój problem, nie potrzebowałem też $ j. Mam edytor WYSIWYG na jednej stronie, która wymaga "jQuery v1.6.1", a to rozwiązanie naprawiło mój konflikt. –

+2

Oto, czego nie rozumiem na temat tej odpowiedzi: w jaki sposób skrypt określa, do której wersji $ s wskazuje i do której wersji $ j wskazuje? – Mark

0

WAY późno .... ale może komuś pomóc - rzucił tym razem

..
/** 
********************************************************************************************************* 
*   jQuery version check 
*   $.noConflict() is not enough to ensure jQuery as well as $ 
*   has correct version (can cause troubles with jQuery plugins that use fn(){}(jQuery); 
* 
*   useage: restoreJquery('1.10.2',true) //for unminimized dev version 
*     restoreJquery('1.10.2')   //for minimized version 
*     restoreJquery('1.10.2',true,myFunction)   //for minimized version, that executes a function once jQuery is in the page 
* 
* 
**/ 

function restoreJquery(wantedVersion,devVersion,callback) { 
    if(!wantedVersion){ 
     wantedVersion= '1.10.2'; 
    } 

    //is current jQuery version ===wanted version? (double check to avoid undefined errors) 
    if($ && $.fn.jquery!==wantedVersion){     

     //if not invoke noConflict with true (true=gives up the jQuery name space aswell as $) 
     var $jQuery = jQuery.noConflict(true); 
     //Line Assign the new object to new instantiated versions of jQuery 
     var $=jQuery=$jQuery;       
     } 

    //if jQuery is still not the correct version inject it into page via plain vanilla js 

    //if $ does not exist or the version is wrong inject it into the page 
    if(!$ || $.fn.jquery!==wantedVersion){ 

     var head=document.getElementsByTagName('head')[0], //get Head 
      jqPath=wantedVersion+'jquery.', // ex '1.10.2/jquery. 
        script=document.createElement('script'); //create empty scripttag 

      if(devVersion){ //minimized or not? 
       jqPath+='min.js'; 
      }else{ 
       jqPath+='js'; 
      } 

     script.src='//http://ajax.googleapis.com/ajax/libs/jquery/'+jqPath; //create src path 
     script.type='text/javascript'; //add type 
     script.async=true; //set async to true 
     //real browsers 
     script.onload=callback; //call callback on load 

     //Internet explorer doesnt support onload on script (typical ie) 
     script.onreadystatechange = function() { 
      if (this.readyState == 'complete') { 
       callback(); 
      } 
     } 


    head.appendChild(script); 

    }else{ 
     //otherwise call the callback since noConflict solved our jQuery versioning issues 
     callback(); 
    } 

}; 
Powiązane problemy