如何在jQuery中存储全局值(不一定是全局变量)?


80

目前,我正在使用一个大量的JavaScript,jQuery,Microsoft客户端JavaScript和其他库的旧网页。最重要的是-我无法从头开始重写整个页面,因为企业无法证明其合理性。所以...就是这样。无论如何,我需要使用变量来污染(我确实没有尝试过)全局名称空间。我在考虑三个选项-

  1. 只需使用普通的JavaScript声明存储/检索它- var x = 0;

  2. 使用jQuery在DOM标签中存储/获取值- $("body").data("x", 0);

  3. 使用隐藏的表单字段,并使用jQuery设置/获取值- $("whatever").data("x", 0);

有没有更好的办法?我查看了现有的一堆代码,但我不相信变量可以在函数中确定范围。

Answers:


100

您可以在jQuery对象中创建一个名称空间,如下所示:

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

要么:

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

请记住,任何名为“ mynamespace”的插件方法都将被覆盖,因此请确保使用明智的名称。


1
为什么要将命名空间变量声明为jQuery的属性?!
Pedro Rolo

5
@Pedro-不需要。我只是指出这是一种可能性。
karim79 2010年

如果要使用它,该在哪里声明?我所有的JavaScript代码都在JS文件中。我不想将JavaScript代码与HTML代码混合使用。
VansFannel

这是一个愚蠢的解决方案,它易于在声明的名称空间与jQuery Object的变量和方法之间发生名称冲突。我不了解此解决方案的价值。对我来说,这不好。
Pedro Rolo

我可以在所有iframe表单父对象中使用此全局变量吗?
图拉西兰

38

对我来说,处理这种情况的最佳方法是在window对象中定义一个对象:

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

这样可以使您的示波器保持整洁。每当您使用window.my_config任何访问代码的人访问全局变量时,都会知道正在访问全局变量。


4
这比使用jquery名称空间对我来说更有意义。是否有任何理由无法通过这种方式更好或更好地工作?
戴蒙

6

您可以在全局范围内创建哈希并将其用作命名空间:

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

这是一个愚蠢的解决方案,它易于在已声明的名称空间与其他全局变量和方法之间发生名称冲突。我不了解此解决方案的价值。对我来说,很烂。
tad

1
您可以控制全局范围内存在哪些名称,而不能控制更新时可能添加到jQuery的方法和变量名称。这是命名空间确实以多种语言显式存在的强大原因之一。如果不这样,名称就会变得很奇怪(即:Smalltalk-systems类名)
Pedro Rolo

4
不总是。没有什么能阻止某些恶意库覆盖您的哈希值。本质上,如果没有显式命名空间,就无法避免该问题。这就是为什么jQuery模块创作文档为命名空间建议在jQuery对象中推荐单个哈希的原因,因为jQuery名称空间实际上仅限于流行的插件。
tad

2

只是与您分享我的做法,我将在所需的JavaScript文件中使用明智的前缀创建一个全局对象/ var,就像在一个对象将作为文本框的页面上工作时,我将其命名为:

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

如果您有多个全局变量,则还可以具有一个命名空间,例如:

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

初始化后,这些变量将在整个网站上向您提供。

我希望这有帮助。



0

请注意:

fancybox是否正在执行AJAX(意思是:如果它在iFrame中加载,则应在close方法中添加“父项”),如下所示:

parent.$.fancybox.close();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.