2010-05-19 9 views
80

Actuellement, je travaille sur une page Web existante qui utilise une tonne de JavaScript, jQuery, client JavaScript Microsoft et d'autres bibliothèques. La ligne du bas - je ne peux pas réécrire toute la page à partir de zéro, car l'entreprise ne peut pas le justifier. Alors ... c'est ce que c'est. Quoi qu'il en soit, je dois polluer (j'ai vraiment essayé de ne pas trop) l'espace de noms global avec une variable. Il y a trois options que je pensais à -Comment stocker une valeur globale (pas nécessairement une variable globale) dans jQuery?

  1. Juste magasin/récupérer à l'aide d'une déclaration JavaScript normale - var x = 0;

  2. Utilisez jQuery pour stocker/récupérer la valeur dans une balise DOM - $("body").data("x", 0);

  3. Utilisez un champ de formulaire caché, et définir/récupérer la valeur avec jQuery - $("whatever").data("x", 0);

Y a-t-il un meilleur moyen? J'ai regardé la pile de code existante, et je ne crois pas que la variable puisse être étendue dans une fonction.

Répondre

100

Vous pouvez créer un espace de noms dans l'objet jQuery, comme ceci:

$.mynamespace = { 
    myVar : "something", 
    myVar2 : "somethingElse" 
}; 

ou:

$.mynamespace = {}; 
$.mynamespace.myVar = "something"; 
$.mynamespace.myVar2 = "somethingElse"; 

Gardez à l'esprit, sera écrasé toute méthode de plug-in nommé 'mynamespace' alors assurez-vous utiliser un nom sensé.

+1

Pourquoi la variable d'espace de noms devrait-elle être déclarée comme attribut de jQuery ?! –

+5

@Pedro - Il n'a pas besoin d'être. Je faisais juste remarquer cela comme une possibilité. – karim79

+0

Si je veux utiliser ceci, où dois-je le déclarer? Tout mon code javascript est dans un fichier JS. Je ne veux pas mélanger du code JavaScript avec du code HTML. – VansFannel

6

Vous pouvez créer un hachage dans la portée globale et l'utiliser comme un espace de noms:

MyNamepace={} 
MyNamespace.newvar = 'value' 
// MyNamespace.newvar => 'value' 
+0

est une solution stupide qui est susceptible de nommer des conflits entre les espaces de noms déclarés et d'autres variables et méthodes globales. Je ne comprends pas la valeur de cette solution. Pour moi, ça craint. – tad

+1

Vous avez le contrôle sur les noms existant dans la portée globale, alors que vous n'avez aucun contrôle sur les méthodes et les noms de variables qui peuvent être ajoutés à jQuery à la mise à jour. C'est l'une des principales raisons pour lesquelles les espaces de noms existent explicitement dans de nombreuses langues. Quand ils ne le font pas, les noms commencent à être étranges (c'est-à-dire: Smalltalk-systems class-names) –

+4

Pas toujours. Il n'y a rien qui empêche une bibliothèque voyou de surcharger votre hash. En substance, vous ne pouvez pas éviter le problème _without_ namespacing explicite. C'est pourquoi la documentation de création du module jQuery recommande un seul hachage dans l'objet jQuery à des fins d'espace de noms, car l'espace de noms jQuery est _de facto_ restreint aux plugins populaires. – tad

2

partage juste ma pratique avec vous, je ferais un objet global/var dans le fichier JavaScript requis avec un raisonnable préfixe, comme si je travaille sur une page où cet objet sera une zone de texte alors je le nommer:

g_TxtMyValue = 'value'; // g_ specifies it to be a global variable, it is one 
          // of the many conventions used 

Si vous avez plus d'une variable globale, vous pouvez aussi avoir un espace de noms tels que:

my_txt = {}; // For a real site I would use a prefix relative to the project 
       // name instead of "my". 

my_txt.testValueOne = 'Value one'; 
my_txt.testValueOne = 'Value two'; 

Ces variables seront disponibles sur l'ensemble du site, après leur initialisation.

J'espère que cela aide.

38

Pour moi, la meilleure façon de gérer cette situation est de définir un objet dans l'objet de la fenêtre:

window.my_config = 
{ 
    my_var1 : 1, 
    my_var1 : 2, 
    my_var1 : 3 
}; 

Cela garder votre champ propre et propre. Et chaque fois que vous voudriez accéder au global en utilisant window.my_config quelqu'un regardant le code saurait qu'un global est accédé.

+4

cela me semble plus logique que d'utiliser l'espace de noms jquery. Y a-t-il une raison pour que cela ne marche pas aussi bien ou mieux? – Damon

0

Juste un bref délai: Est-ce le fancybox est AJAX (ce qui signifie qu'il charge dans un iFrame, vous devez ajouter "parent" à la méthode close, comme ceci: js parent.$.fancybox.close();