代码之家  ›  专栏  ›  技术社区  ›  Eli

jQuery:从数组循环中设置点击

  •  9
  • Eli  · 技术社区  · 17 年前

    我在header/body模式中有一系列div,点击header将显示有问题的body。

    这一切都发生在页面准备就绪时点击初始化。..

    与其这样做(这很好,但很痛苦):

    $('#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将用正确的值发出警报,但没有点击绑定。我仍然对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]);
        }
    });
    
    4 回复  |  直到 17 年前
        1
  •  12
  •   geowa4    17 年前

    是的,我经常遇到这个问题。 Area 是一个全局变量,因为它没有 var 在此之前。另外,不要使用for。..在建设中。

    但你可能仍然会遇到类似的问题。天知道我因为类似的bug调试了多少脚本。执行以下操作可以保证正确的范围界定:

    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
  •  3
  •   Sophie Alpert    17 年前

    这是一个JavaScript的东西;这与jQuery无关。你正在做的是创建一个闭包,但你没有正确理解它们是如何工作的。

    你可能想读一下 http://blog.morrisjohns.com/javascript_closures_for_dummies 特别是实施例5、6和7。

        3
  •  2
  •   typeoneerror    17 年前

    检查“Area”变量的范围。你基本上是在分配一个全局变量,所以在最后一次迭代中,“Area”的作用域在循环之外。

        4
  •  1
  •   Yi Jiang G-Man    15 年前

    确保在加载DOM后添加了点击事件处理 您可以将其包含在head元素中:

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