2010-05-19 57 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();