2010-07-08 78 views
2

這應該是相當簡單的;我很確定我只是沒有理解它。jQuery - 功能之間共享變量

僅供參考,網站使用jQuery在內容上運行ajax .load()。

在我的主父頁面,在標題中,我有我的資產淨值.load()jQuery代碼: -

<script type="text/javascript" charset="utf-8"> 

    $(document).ready(function(){ 

     $('a.nav').click(function() { 
      page = $(this).attr('page'); 
      projID= $(this).attr('projID'); 

      if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); } 

      switch(page) { 

      case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; 
      case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; 
      case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; 
      case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; 

      } 
      $('#mainRight').show(300); 

     }); 

現在,基本上我想PROJID被rememebred供其他a.nav點擊使用那不提供它。

調用它的鏈接錨看起來像<a page="projSettings" projID="522" class="nav">Settings</a>,我願意保存它522.所以,其他請求(沒有projID,因爲數據已被加載到其他導航的DOM,他們不知道的PROJID。我希望是有道理的。

所以,我想知道如何能有像<a page="projSettings" class="nav">settings</a>鏈接時PROJID已經在先前的調用中使用。

有什麼想法?

回答

6

好,具有諷刺意味你已經保存projID全球(還好說,內window object通過在聲明中使用var的。

所以,你已經可以訪問projID代碼中的任何地方,一旦它被初始化。

反正這不是一個好的實踐,相反,這是一個非常糟糕的實踐。

我能想到的最佳方式是創建自己的應用程序對象,在其中存儲所有數據並從那裏訪問它。

var your_application = { 
    var foo = 'bar', 
     base = 'ball';   
}; 

// your_application.foo = 'another bar'; 

您可以使用關閉函數式編程很遠推動這一原則。一個更好的解決方案來存儲和保持數據的本地和全球不(窗口)可能看起來像

var your_application = function(){ 
    var foo = 'bar', 
     base = 'ball'; 

    return { 
     getfoo: function(){ 
      return foo; 
     }, 
     setfoo: function(newfoo){ 
      foo = newfoo; 
     } 
    }; 
}); 

var app = your_application(); 
app.setfoo('foobar!'); 
alert(app.getfoo()); 

這是有條不紊 Javascript編程的想法。在那裏有一些很好的書,我建議開始與道格拉斯克羅克福德Javascript: the good parts

另一種解決方案應該是jQuery .data()方法,該方法能夠將數據存儲在全局散列中。

// store 
$.data(document.body, 'projID', projID); 

// access 
var foo = $.data(document.body, 'projID'); 

// remove 
$.removeData(document.body, 'projID'); 
+0

哎jAndy ,,,可以ü請告訴我們的示例代碼???它將有助於理解。非常感謝... – 2010-07-08 07:48:36

+0

G8t非常感謝。 – 2010-07-08 07:54:15

+0

jAndy可以請你給我一些關於在your_application.i中的基本細節,這意味着它的目的是什麼? 謝謝 – 2010-07-08 07:57:53

0

只需在js scri的開始處輸入以下行p-

var projID; 
0

只需在函數外定義變量,它將變爲全局變量。

0

是使其成爲全局變量。 添加var projID;在腳本開始。 同意薩達特。

0

如果我理解正確的話,你有被施加爲.click()處理各種a.nav元素一個功能,並且希望projID變量只需要設置一次,忽然想起同樣功能的未來調用。

這似乎是靜態變量的完美用例。一個靜態變量將在函數調用之間保留它的值,但仍然在該函數中作用域。 JavaScript本身沒有明確的靜態變量,但可以模擬它們by defining a variable as a member of that function;最終結果是一樣的。下面是從該鏈接的代碼:

function countMyself() { 
    // Check to see if the counter has been initialized 
    if (typeof countMyself.counter == 'undefined') { 
     // It has not... perform the initilization 
     countMyself.counter = 0; 
    } 

    // Do something stupid to indicate the value 
    alert(++countMyself.counter); 
} 
0

我沒有測試過,但下面的修改應該使它:

<script type="text/javascript" charset="utf-8"> 
    var projID = null; // Better to have some default here 

    $(document).ready(function(){ 

     $('a.nav').click(function() { 
      var page = $(this).attr('page'); 
      projID= $(this).attr('projID') || projID; 

      if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); } 

      switch(page) { 

      case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; 
      case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; 
      case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; 
      case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; 

      } 
      $('#mainRight').show(300); 

     }); 
0

試試這個,我做你的代碼更簡單..

<script type="text/javascript" charset="utf-8"> 
    var projID; // making it global 
    $(document).ready(function(){ 

     $('a.nav').click(function() { 
      page = $(this).attr('page'); 
      projID= $(this).attr('projID'); 

      if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }     

      switch(page) { 

      case 'projMetrics': projID = '5000227'; break; 
      case 'projShare': projID: '5000227'; break; 

      } 

      $('#mainRight').load("content.php?load=" + page, { projID: projID}, function(){ 
        $(this).show(); 
      }); 

     }); 
    }) 
</script> 
0

原型會不會是更好地做到這一點用?

function System() 
{ 
    settings = { 
     'Foo': 'Bar' 
    } 
} 

//Then define a prototype 
System.prototype.getSetting = function(key) 
{ 
    return settings[key] || undefined; 
} 


System = new System(); 
alert(System.getSetting('Foo'));​ 
+0

當然可能,但所有變量仍然是「公共」可訪問的。 – jAndy 2010-07-08 08:44:43