2011-03-08 10 views
5

Chcemy zaktualizować jedną wersję jQuery do innej. Używamy różnych wtyczek online i napisaliśmy wiele własnych. Wyzwanie polega teraz na próbie POWOLI MIGRUJCIE wszystkich obiektów skryptowych POWOLI bez pełnego przepisywania. Mam pomysł, w jaki sposób sobie z tym poradzić:Czy istnieje elegancki sposób na powolne aktualizowanie jQuery?

ale mam pytania:

  1. jest idea poniżej nawet dobry pomysł?
  2. Czy mogę (bezpośrednio) powiedzieć każdemu obiektowi jQuery, w którym znajdują się zależności?
  3. Jeśli to zły pomysł ... jak sobie z tym poradzić?
  4. Czy po prostu przepisuję KAŻDY obiekt, który się łamie po aktualizacji? (Sux!)

Wyjaśniając problem:
Jeśli wszystkie swoje plug-in na żywo wyłącznie w zakresie jednej strony, a następnie różne wersje są łatwo skierowana: po prostu zrobić plik-includes na stronie poziom zamiast poziomu strony głównej (duh!). Jednak obiekty znajdujące się na stronie głównej lub w kontrolkach użytkownika są nieco trudniejsze ... ponieważ potrzebują konkretnych wersji, aby działały poprawnie.

Oto mój pomysł:
Definicja plug-in zaczyna się od anonimowej funkcji.

(function ($){<!- code goes here -->})(jQuery); 

Wszystkie zależności, które widziałem, wykorzystują to jako punkt wyjścia.

PRZYKŁADY: jQuery Zależności obejmują wtyczek takich jak: ui.widget, ui.position, ui.core itp

Więc co, jeśli odwołać każdą wersję jQuery (i jego zależności) przy użyciu JavaScript obiekt i przekazać TEGO PRZEDMIOTU do różnych wtyczek wewnętrznych i internetowych?

odniesień obiekt może wyglądać tak:

var jQueryVersion1_3_2 = function(){<!- paste the files contents here-->}; 
var jQueryVersion1_4_4 = function(){<!- paste the files contents here-->}; 

wtyczek:
My wewnętrznych i internetowych wtyczek może zostać zachowany jako (normalny) Plik- linki, ale z następującymi zmianami

odchodzą od tej:

// Plug-in X 
(function ($){<!- its untouched code -->})(jQuery); 
// Plug-in Y 
(function ($){<!- its untouched code -->})(jQuery); 
// Plug-in Z 
(function ($){<!- its untouched code -->})(jQuery); 

... wersja tutaj jest do bani!

do tego ...

// Plug-in X 
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2); 
// Plug-in Y 
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2); 
// Plug-in Z 
(function ($){<!- its untouched code -->})(jQueryVersion1_4_4); 

... teraz możemy uaktualnić nasze obiekty powoli.

Jedynym problemem SEE
Wyzwaniem staje zależności wtykowych (między wersjami).W uaktualnieniu testu następowało rozpoczynanie od różnych wtyczek, takich jak:

  • ui.widget, ui.position, ui.core, itd. (Wszystkie zostały przerwane po aktualizacji).

tylko odpowiedź widzę to:
Owijanie jQuery i wszystkie różne odniesienia do pojedynczej funkcji oszczędzania i do zmiennej powyżej. Następnie przekaż TEN obiekt pośredniczący do każdej wtyczki AS jQuery.

Pomóż mi Obi-Wan Kenobi ... jesteś moją jedyną nadzieją!

+3

Jaki jest tego powód? Czy uważasz, że niektóre z Twoich wtyczek przestałyby działać po aktualizacji? (Po prostu ciekawy ... W moim doświadczeniu przejście do nowszej wersji jQuery zawsze było bezbolesne) – Andrey

+2

Czy używasz tak wielu przestarzałych funkcji? Zawsze możesz sprawdzić 'http: //docs.jquery.com/Release: jQuery_1.3.2' (zmieniając 1.3.2 z wersją, o której mowa) i sprawdzić, co może wymagać zmiany. w przeciwnym razie ładowanie każdej biblioteki i 'var jQuery_1_3_2 = $ .noConflict()' może być twoim najlepszym wyborem (choć prawdopodobnie dużo narzutów). –

+0

Pamiętaj, że nie chcemy ponownie pisać każdej wtyczki. Chcemy dotknąć tylko kilku naraz. Mamy wiele wtyczek: niektóre są opracowywane wewnętrznie, a inne ze źródeł internetowych. I tak ... obiekty ulegają awarii po aktualizacji z powodu przestarzałości itp. Ale to nie jest pytanie. Już wiem, jak boleśnie odgadnąć i przetestować ... Szukam czegoś bardziej eleganckiego. –

Odpowiedz

1

Korzystanie $ .noConflict globalnie tworzyć wszystkie wersje

<script src="jquery 1.x" /> 
<script> 
    var jQuery_1_x = $.noConflict(true); 
</script> 
... 

następnie owinąć każdy plugin jQuery, wewnętrzny lub 3rd w zamknięciach jak:

(function(jQuery, $) { 

    ... // code 

}(jQuery_1_x, jQuery_1_x)); 

Jedyną rzeczą, która może zerwać z tym Metoda to kod innej firmy, który używa var foo poza dowolnymi funkcjami do tworzenia obiektów globalnych. Trzeba szukać wszelkich globalnych funkcji/obiektów/metod i podnosić je ręcznie za pomocą

window.foo = ...

szczęście tworzenie globalnych funkcji/obiektów/metod jest uważana za złą formą tą metodą tak więc nie powinno być zbyt wiele te.

+0

PYTANIE: Użycie funkcji noConflict (true) usuwa wszystkie zmienne jQuery z zakresu globalnego ... tak, jak to pomaga, gdy chcesz używać 2 zmiennych do przechowywania różnych wersji jQuery? - Dzięki –

+0

Oto co robi noConflict: window. $ = _ $; if (deep) window.jQuery = _jQuery; return jQuery; Wszystko, co widzę, to to, że zapisuje obiekt jQuery do zmiennej globalnej w oknie (zamiast $) ... więc muszę czegoś pomijać.-Dzięki –

+0

@Robalot, gdy wersja jQuery ładuje, buforuje zmienne w '$' i 'jQuery' obecnie do' _S' i '_jQuery'. Pierwsze ładowanie jQuery buforuje 'undefined'. To, co to robi, jest ustawione na wartość 'undefined' i powoduje powrót do' $ '. Więc usuwa jQuery z zasięgu globalnego i zwraca jQuery. – Raynos

Powiązane problemy