¿Cómo almacenar un valor global (no necesariamente una variable global) en jQuery?

80

Actualmente estoy trabajando en una página web heredada que usa una tonelada de JavaScript, jQuery, cliente de Microsoft JavaScript y otras bibliotecas. La conclusión: no puedo reescribir toda la página desde cero ya que el negocio no puede justificarlo. Así que, es lo que es. De todos modos, necesito contaminar (realmente no lo intenté) el espacio de nombres global con una variable. Hay tres opciones en las que estaba pensando:

  1. Simplemente almacénelo / recupérelo usando una declaración de JavaScript normal - var x = 0;

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

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

¿Existe una forma mejor? Miré la pila de código existente y no creo que la variable pueda tener un alcance en una función.

Kris Krause
fuente

Respuestas:

100

Puede crear un espacio de nombres dentro del objeto jQuery, así:

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

o:

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

Tenga en cuenta que cualquier método de complemento llamado 'mynamespace' se sobrescribirá, así que asegúrese de usar un nombre razonable.

karim79
fuente
1
¿Por qué debería declararse la variable de espacio de nombres como un atributo de jQuery?
Pedro Rolo
5
@Pedro - No es necesario. Solo estaba señalando esto como una posibilidad.
karim79
Si quiero usar esto, ¿dónde tengo que declararlo? Todo mi código javascript está en un archivo JS. No quiero mezclar código JavaScript con código HTML.
VansFannel
esta es una solución tonta que es propensa a nombrar conflictos entre los espacios de nombres declarados y las variables y métodos del objeto jQuery. No entiendo el valor de esta solución. Para mí, no es bueno.
Pedro Rolo
¿Puedo usar esta variable global en todos los padres del formulario de iframe?
Thulasiram
39

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

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

Esto mantendría su endoscopio limpio y ordenado. Y cada vez que acceda al global usando window.my_configcualquiera que mire el código sabrá que se está accediendo a un global.

ovais.tariq
fuente
4
esto tiene más sentido para mí que usar el espacio de nombres jquery. ¿Hay alguna razón por la que esta forma no funcionaría tan bien o mejor?
Damon
6

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

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'
Pedro Rolo
fuente
Esta es una solución tonta que es propensa a conflictos de nombres 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 alcance global, mientras que no tiene control sobre los métodos y nombres de variables que podrían agregarse a jQuery en la actualización. Esta es una de las principales razones por las que los espacios de nombres existen explícitamente en muchos idiomas. Cuando no lo hacen, los nombres comienzan a ser extraños (es decir: nombres de clases de Smalltalk-systems)
Pedro Rolo
4
No siempre. No hay nada que impida que una biblioteca deshonesta anule su hash. En esencia, no puede evitar el problema sin un espacio de nombres explícito. Esta es la razón por la que la documentación de creación del módulo jQuery recomienda un solo hash en el objeto jQuery para fines de espacio de nombres, porque el espacio de nombres jQuery está restringido de facto a complementos populares.
Tad
2

Solo compartiendo mi práctica con usted, haría un objeto global / var en el archivo JavaScript requerido con un prefijo sensible, como si estuviera trabajando en una página donde este objeto será un cuadro de texto, entonces lo nombraría:

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

Si tiene más de una variable global, también puede tener un espacio de nombres 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 para usted en todo el sitio web, después de que se hayan inicializado.

Espero que esto ayude.

Umair Jabbar
fuente
0

Utilice guión bajo isEmpty().

_.isEmpty('')volverá true.

Eldad
fuente
0

Solo un breve aviso:

¿El fancybox está haciendo AJAX (es decir: si se carga dentro de un iFrame, debe agregar "parent" al método de cierre), así:

parent.$.fancybox.close();
Moriz
fuente