2012-10-26 2 views
10

J'ai un projet qui utilise plusieurs contextes requis et des versions et plugins jQuery chargés dynamiquement. (Les versions de jQuery seront centralisées et ne seront pas intégrées). L'intégrité de jQuery pour l'hôte et chaque contexte ainsi que l'isolation du plugin sont critiques.RequireJS - Isolation des versions et des plugins jQuery dans les contextes

Je suis en train d'écrire un plugin chargeur pour RequireJS pour traiter les cas d'utilisation suivants:

  • Dans un spécifique nécessite contexte
  • Et sans affecter la note de bas de la page d'accueil ou tout autre exigent contexte, je comme à:
    • charge une version de jQuery j'ai besoin
    • plugins de charge sur la fn de ma version jQuery spécifique
    • Avoir l'intégrité référentielle sur une version jQuery requise de telle sorte que tout module dans mon contexte peut avoir besoin de partager des plugins

J'ai un exemple de projet pour le chargeur avec des tests here.

L'échec de la dernière condition lorsque j'effectue un second appel à l'aide du chargeur consiste à faire sauter la version précédente. J'utilise également eval pour isoler les références $ dans les plugins chargés dans la portée de la version jQuery chargée localement. Toute idée d'un meilleur moyen de le faire serait appréciée.

Voulez-vous rester simple (stupide) s'il y a une solution plus facile/plus propre.

Merci beaucoup.

+0

Et pour éviter eval vous pourriez avoir un script côté serveur concatenate 'define ([ 'jquery version'], la fonction (jQuery) { var $ = jQuery; '+ [le plugin src] +'}); 'puis de charger un plugin appelez ce script avec le nom du plug-in et la version de jquery dans la chaîne de requête – wheresrhys

Répondre

1

J'ai aussi dû faire cela dans un plugin. Vous devriez vérifier http://api.jquery.com/jQuery.noConflict/. Pour donner un exemple:

jQueryLocal = jQuery.noConflict(true); 

Mais vous devriez certainement essayer d'éviter de charger plusieurs jQueries. Vous pouvez, par exemple, vérifier si une version suffisante est déjà chargée (dans mon cas, j'ai vérifié si 1.9+ était disponible avant de charger quoi que ce soit, et si oui, définissez la variable locale sur une simple référence à l'objet jQuery global existant Je n'utilisais pas les plugins

vous pouvez vérifier la version avec:.

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