2010-12-13 101 views
2

想想看,我有10个输入框,(使用据透露日期选择器插件)JavaScript的for循环不拾取值id

我点击输入框时,一组特定的要求,或plux /负div也被击中(根据需要显示/隐藏10个框)。

此循环似乎没有选取x和y变量。

警告我一直回声6例如..不知道为什么..

这里是我的环...和想法x和y似乎没有,为什么要设置?

for (var x = 1; x <= 10; x++) { 
    var y = x+1; 
    $('#date_start'+y).attr("disabled", "disabled"); 
    $('#date_start'+x).datetimepicker(); 

    $('#date_start'+x).blur(function() { 
     if (isset($('#date_start'+x).val())) { 
      $('.add_time_'+x).css('visibility', 'visible'); 
     } else { 
      $('.add_time_'+x).css('visibility', 'hidden'); 
      $('.rem_time_'+y).css('visibility', 'hidden'); 
     } 
    }); 

    $('.add_time_'+x).click(function() { 
     alert('ici: ' + y); 
     $('.date_'+y).css('visibility', 'visible'); 
     $('#date_start'+y).removeAttr("disabled"); 
     $('.rem_time_'+y).css('visibility', 'visible'); 
    }); 

    $('.rem_time_'+y).click(function() { 
     $('.date_'+y).css('visibility', 'hidden'); 
     $('#date_start'+y).attr("disabled", "disabled"); 
     $('#date_start'+y).val(''); 
     $('.rem_time_'+y).css('visibility', 'hidden'); 
     $('.add_time_'+y).css('visibility', 'hidden'); 
    }); 
} 

=== 注意,isset,是一个单独的功能,我要检查如果字段值为空/不设置 当我尝试和回声出$(“#DATE_START”的+ x的值).val()

它回声未定义...即使相应的输入HAS屏幕上的值。

+1

阅读:http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work – sje397 2010-12-13 14:50:43

+1

你是在循环中定义函数。请参阅http://blog.morrisjohns.com/javascript_closures_for_dummies.html示例5. – 2010-12-13 14:51:17

回答

2

在事件处理程序中使用外部变量时,您需要打包关闭。让我们把你的例子:

$('#date_start'+x).blur(function() { 
     if (isset($('#date_start'+x).val())) { 
      $('.add_time_'+x).css('visibility', 'visible'); 
     } else { 
      $('.add_time_'+x).css('visibility', 'hidden'); 
      $('.rem_time_'+y).css('visibility', 'hidden'); 
     } 
    }); 

这将始终使用外面的变量x和y,而不是创造这个事件处理程序的时间值的最后一个值。你需要做的是把它包在立即执行功能:

$('#date_start'+x).blur((function(xlocal, ylocal) { 
     return function() { 
      if (isset($('#date_start'+xlocal).val())) { 
       $('.add_time_'+xlocal).css('visibility', 'visible'); 
      } else { 
       $('.add_time_'+xlocal).css('visibility', 'hidden'); 
       $('.rem_time_'+ylocal).css('visibility', 'hidden'); 
      } 
     } 
    })(x,y)); 
+2

准确地说,代码已经包含闭包。你将它们包装在一个即时函数中以“捕获”这些值。 – 2010-12-13 15:04:58

+1

@Felix - 谢谢,我把术语混合了一下:) – Andrey 2010-12-13 15:23:48