2009-01-30 53 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); 
     }); 
    }); 
}