2009-01-30 91 views
9

我有一系列的標題/正文模式的div,點擊標題將顯示正在討論的正文。jQuery:設置點擊數組循環

這一切發生與準備。點擊頁面上初始化...

,而不是做這個(工作正常,但它是一個痛苦):

$('#show_fold_ping').click(function(){ ShowArea('#fold_ping') }); 
$('#show_fold_http').click(function(){ ShowArea('#fold_http') }); 
$('#show_fold_smtp').click(function(){ ShowArea('#fold_smtp') }); 
$('#show_fold_pop3').click(function(){ ShowArea('#fold_pop3') }); 
... 

我試圖做到這一點:

var Areas = ['ping','http', 'smtp', 'pop3']; 

for(var i in Areas){ 
    Area = '#show_fold_'+Areas[i]; 
    $(Area).click(function(){ alert(Area); /* ShowArea(Area); */ }); 
} 

我遇到的問題是,他們似乎都被初始化爲最後一個。 IE:如果pop3是最後一個,點擊#show_fold_ [any]會提示'#show_fold_pop3'。

這看起來應該很簡單。我錯過了一些顯而易見的東西,或者將字符串傳遞給我不知道的jQuery有問題嗎?

編輯:

嘿嘿,這些都是很大的。我讀了一些關於閉包和自我調用的函數,並且(kindasorta)得到它。

到目前爲止,我有這個,但點擊似乎沒有正確綁定。區域將以正確的值進行警報,但沒有點擊綁定。我是否仍然與Area有範圍問題,或者我完全不符合標準?

$(function(){ 

    Areas = ['ping','http', 'smtp', 'pop3', 'imap', 'ftp', 'dns', 'tcp', 'database', 'seo']; 

    for(var i = 0; i < Areas.length; i++){ 
     (function (Area) { 
          alert(Area); 
      $("#show_fold_"+Area).click(function(){ alert('x'); }); 
     })(Areas[i]); 
    } 
}); 
+0

不應該$(「#fold _」+ Area).click(...)是$(「#show_fold _」+ Area).click(...)? – 2009-01-30 03:33:18

+0

是的!謝謝 - 就是這樣。所以專注於我去語義上的語法盲= o) – Eli 2009-01-30 08:20:39

回答

12

是的,我經常遇到這個問題。 Area是一個全局變量,因爲它之前沒有var。另外,不要在構造中使用for ...。

但是你可能仍然遇到類似的問題。由於類似的錯誤,上帝知道我調試了多少個腳本。執行以下操作可保證適當的範圍:

var Areas = ['ping','http', 'smtp', 'pop3']; 

for(var i = 0; i < Areas.length; i++){ 
    (function(area) { 
    $(area).click(function(){ alert(area); /* ShowArea(area); */ }); 
    })(Areas[i]); 
} 
2

檢查「區域」變量的範圍。你基本上是在分配一個全局變量,所以在最後一次迭代中,「區域」被限制在循環之外。

1

確保您添加的單擊事件的DOM加載後處理 您可以包括這個頭元素:

var Areas = ['ping','http', 'smtp', 'pop3']; 

$(document).ready(function() { 
    $.each(Areas, function(i, v){ 
     var Area = '#show_fold_' + v; 
     $(Area).click(function() { 
      alert(Area); 
     }); 
    }); 
}