2012-10-26 8 views
10

Ich habe ein Projekt, das mehrere Require-Kontexte und dynamisch geladene jQuery-Versionen und Plugins verwendet. (Die jQuery-Versionen werden zentral bezogen und nicht inline sein). Die jQuery-Integrität für den Host und jeden Kontext sowie die Plugin-Isolation sind kritisch.RequireJS - jQuery-Versionen und Plugins in Kontexten isolieren

Ich schreibe eine Lader-Plugin für RequireJS die folgenden Anwendungsfälle zu behandeln:

innerhalb eines bestimmten
  • erfordern Kontext
  • Und ohne die fn der Hosting-Seite zu beeinflussen oder zu jedem anderen Kontext benötigen, würde ich wie zu:
    • laden jede Version von jQuery muss ich
    • laden Plugins auf die fn meiner spezifischen jQuery Version
    • Haben referentiellen Integrität auf einer jQuery benötigte Version, so dass jedes Modul in meinem erfordern Kontext kann Plugins teilen

Ich habe ein Beispielprojekt für den Lader mit Tests here.

Es ist in der letzten Bedingung fehlgeschlagen, wenn ich einen zweiten Anruf mit dem Lader, es bläst weg die vorherige Version.

Ich benutze auch eval, um die $ Referenzen in den geladenen Plugins auf den lokal geladenen jQuery-Versionsbereich zu isolieren. Irgendwelche Gedanken zu einem besseren Weg, dies zu tun, würden geschätzt werden.

Möchten Sie es einfach halten (dumm), wenn es eine einfachere/sauberere Lösung gibt.

Danke, viel.

+0

Und eval vermeiden Sie eine serverseitige Skript verketten haben könnte 'definieren ([ 'jquery-Version'], Funktion (jQuery) { var $ = jQuery; '+ [das Plugin src] +'}); 'und dann laden Sie ein Plugin rufen Sie dieses Skript mit dem Namen des Plug-Ins und jquery in der Abfrage-String – wheresrhys

Antwort

1

Ich musste dies auch in einem Plugin tun. Sie sollten http://api.jquery.com/jQuery.noConflict/ auschecken. Um ein Beispiel zu geben:

jQueryLocal = jQuery.noConflict(true); 

Aber Sie sollten sicherlich versuchen, das Laden mehrerer jQueries zu vermeiden. Sie könnten zum Beispiel prüfen, ob bereits eine ausreichende Version geladen ist (in meinem Fall habe ich überprüft, ob 1.9+ verfügbar war, bevor Sie etwas laden, und wenn dies der Fall ist, setzen Sie die lokale Variable auf einen einfachen Verweis auf das vorhandene globale jQuery-Objekt) ich war nicht Plugins

Sie können die Version überprüfen:.

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); 
}