2010-05-19 12 views
80

Actualmente estoy trabajando en una página web heredada que usa toneladas de JavaScript, jQuery, JavaScript de cliente de Microsoft y otras bibliotecas. La conclusión: no puedo volver a escribir toda la página desde cero ya que la empresa no puede justificarla. Así que, es lo que es. De todos modos, necesito contaminar (realmente lo intenté) el espacio de nombre global con una variable. Hay tres opciones que estaba pensando -Cómo almacenar un valor global (no necesariamente una variable global) en jQuery?

  1. tienda sólo/recuperarlo utilizando una declaración normal JavaScript - var x = 0;

  2. Uso jQuery para almacenar/recuperar el valor de una etiqueta DOM - $("body").data("x", 0);

  3. utilizar un campo de formulario oculto, y establecer/recuperar el valor con jQuery - $("whatever").data("x", 0);

¿Hay una manera mejor? Miré la pila existente de código, y no creo que la variable se pueda determinar en una función.

Respuesta

100

Se puede crear un espacio de nombres en el interior del objeto jQuery, así:

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

o:

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

Tenga en cuenta, cualquier método plug-in llamado 'MyNamespace' se sobrescribirán así que asegúrese para usar un nombre sensato

+1

¿por qué la variable de espacio de nombres debe declararse como un atributo de jQuery ?! –

+5

@Pedro - No necesita ser. Solo estaba señalando esto como una posibilidad. – karim79

+0

Si quiero usar esto, ¿dónde debo declararlo? Todos mis códigos javascript están en un archivo JS. No quiero mezclar código JavaScript con código HTML. – VansFannel

6

Puede crear un hash en el ámbito global y lo utilizan como un espacio de nombres:

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

This es una solución tonta que es propensa a nombrar los choques entre los espacios de nombres declarados y otras variables y métodos globales. No entiendo el valor de esta solución. Para mí, apesta. – tad

+1

Tiene control sobre qué nombres existen en el ámbito global, mientras que no tiene control sobre los métodos y nombres de variables que se pueden agregar a jQuery en la actualización. Esta es una de las razones más importantes por las que los espacios de nombres existen explícitamente en muchos idiomas. Cuando no lo hacen, los nombres comienzan a ser extraños (por ejemplo: Smalltalk-systems class-names) –

+4

No siempre. No hay nada que impida que una biblioteca deshonesta anule tu hash. En esencia, no se puede evitar el problema _sin_ espacios de nombres explícitos. Esta es la razón por la cual la documentación de autoría del módulo jQuery recomienda un solo hash en el objeto jQuery para el propósito del espacio de nombres, porque el espacio de nombres de jQuery está _de facto_ restringido a los plugins populares. – tad

2

Sólo compartir mi práctica con usted, me gustaría hacer un objeto/var global en el código JavaScript necesario presentar con una sensata prefijo, como en si estoy trabajando en una página donde este objeto será un cuadro de texto a continuación, me gustaría nombrarlo:

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

Si usted tiene más de una variable global, también puede tener un espacio de nombres, tales como:

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'; 

Estas variables estarán disponibles en todo el sitio web, una vez que se hayan inicializado.

Espero que esto ayude.

38

Para mí la mejor manera de manejar esta situación es definir un objeto en la ventana de objeto:

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

Esto mantendría su alcance limpio y ordenado. Y cada vez que accede al mundo usando window.my_config, cualquiera que mire el código sabrá que se está accediendo a un global.

+4

esto tiene más sentido para mí que usar el espacio de nombres jquery. ¿Hay alguna razón para que esto no funcione tan bien o mejor? – Damon

0

Sólo un corto plazo: ¿La FancyBox es AJAX (lo que significa que se carga dentro de un marco flotante, se debe añadir "padre" al método close, así: js parent.$.fancybox.close();