2012-10-26 7 views
10

Mam projekt, który wykorzystuje wiele kontekstów wymagających i dynamicznie ładowane wersje i wtyczki jQuery. (Wersje jQuery będą pobierane centralnie i nie będą inline). integralność jQuery dla hosta i każdego kontekstu, jak również izolacja wtyczki są krytyczne.RequireJS - izolowanie wersji i wtyczek jQuery w kontekście

Piszę plugin ładowarka RequireJS obsługiwać następujące przypadki użycia:

  • w określonym wymagają kontekstu
  • A bez wpływu na fn strony hostingowej lub jakiekolwiek inne wymagają kontekstu, chciałbym jak do:
    • załadować dowolny wersja jQuery muszę
    • wtyczek załadować na fn mojej konkretnej wersji jQuery
    • Czy więzów integralności na wymaganej wersji jQuery tak, że każdy moduł w moim wymagają kontekstu mogą dzielić wtyczek

Mam projekt przykład do ładowarki z testów here.

Występuje błąd w ostatnim warunku, gdy wykonuję drugie połączenie za pomocą programu ładującego, odrzuca on poprzednią wersję.

Używam również eval do izolowania odniesień $ w wczytanych wtyczkach do lokalnie załadowanego zakresu wersji jQuery. Wszelkie przemyślenia na lepszy sposób to byłoby docenione.

Chcesz, aby było proste (głupie), jeśli istnieje łatwiejsze/czystsze rozwiązanie.

Dzięki, dużo.

+0

i uniknąć eval można mieć skryptu po stronie serwera CONCATENATE 'define ([ 'jquery-wersja'], funkcja (jQuery) { var $ = jQuery; '+ [the plugin src] +'}); 'a następnie załadować wywołanie wtyczki tego skryptu z nazwą wtyczki i wersją jquery w ciągu zapytania – wheresrhys

Odpowiedz

1

Musiałem również zrobić to w wtyczce. Powinieneś sprawdzić http://api.jquery.com/jQuery.noConflict/. Aby podać przykład:

jQueryLocal = jQuery.noConflict(true); 

Ale powinieneś zdecydowanie unikać ładowania wielu jQueries. Można na przykład sprawdzić, czy wystarczająca wersja jest już załadowana (w moim przypadku sprawdziłem, czy 1.9+ było dostępne przed załadowaniem czegokolwiek, a jeśli tak, ustaw zmienną lokalną na proste odniesienie do istniejącego globalnego obiektu jQuery, ale potem I nie był przy użyciu wtyczek

można sprawdzić wersję z.

var jQueryLocal; 
var versions = (jQuery && /^([0-9]+)\.([0-9]+)\./.exec(jQuery.fn.jquery)) || [0,0]; 
if(versions[0] > 1 || versions[1] >= 9) { 
    jQueryLocal = jQuery; 
} else { 
    // load script with whatever you're doing. If it's asynchronous, set callbacks etc. 
    jQueryLocal = jQuery.noConflict(true); 
}