2010-05-19 58 views
80

目前,我正在使用大量JavaScript,jQuery,Microsoft客户端JavaScript和其他库的传统网页。底线 - 我无法从头开始重写整个页面,因为业务无法证明它的正确性。所以...它就是这样。无论如何,我需要用变量来污染(我真的没有试过)全局命名空间。有三个选项,我想 -如何在jQuery中存储全局值(不一定是全局变量)?

  1. 只是存储/使用常规的JavaScript声明检索 - var x = 0;

  2. 使用jQuery存储/检索一个DOM标签的价值 - $("body").data("x", 0);

  3. 使用隐藏表单域,并设置/检索与jQuery的价值 - $("whatever").data("x", 0);

有没有更好的方法?我查看了现有的一堆代码,并且我不相信该变量可以在函数中作用域。

回答

100

您可以创建一个命名空间中的jQuery对象里面,就像这样:

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

或:

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

请记住,名为“了myNameSpace”任何插件方法将被覆盖,所以可以肯定的使用明智的名字。

+1

为什么应该将命名空间变量声明为jQuery的属性? – 2010-05-19 15:36:03

+5

@Pedro - 它不需要。我只是指出这是一种可能性。 – karim79 2010-05-19 15:39:31

+0

如果我想用这个,我在哪里申报?我所有的JavaScript代码都在一个JS文件中。我不想将JavaScript代码与HTML代码混合在一起。 – VansFannel 2011-05-29 10:21:43

6

您可以在全球范围内建立一个哈希并用它作为一个命名空间:

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

这是一个愚蠢的解决方案,它很容易在声明的名称空间和其他全局变量和方法之间发生冲突。我不明白这个解决方案的价值。对我来说,它很糟糕。 – tad 2011-09-06 21:42:13

+1

您可以控制全局范围中存在哪些名称,但您无法控制可能在更新时添加到jQuery的方法和变量名称。这是命名空间明确存在于许多语言中的强有力的原因之一。当他们不知道时,名称开始变得陌生(即:Smalltalk系统类名称) – 2011-09-07 13:19:21

+4

并非总是如此。没有什么能阻止一些流氓图书馆重写你的哈希。实质上,你不能避免显式的命名空间问题。这就是为什么jQuery模块创作文档建议在jQuery对象中为出于命名空间目的使用单个散列的原因,因为jQuery命名空间被限制为流行的插件。 – tad 2011-09-07 22:28:35

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

这些变量将在整个网站初始化后供您使用。

我希望这会有所帮助。

38

对于我来处理这种情况的最好办法是在窗口对象定义一个对象:

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

这将让你的范围整洁。无论何时您使用window.my_config访问全局,任何查看代码的人都会知道全局正在被访问。

+4

这对我来说比使用jquery命名空间更有意义。这种方式有什么理由不会一样好或者更好吗? – Damon 2011-12-09 20:45:06

0

只是一个短期的通知: 是对的fancybox是AJAX(这意味着它加载在iFrame中,你应该添加“父” close方法,像这样: js parent.$.fancybox.close();