2010-12-13 96 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