-1

JavaScript の奇妙な「遅延」動作。これはうまく機能しています:

$(document).on("change", "#dropdown-menu-category-chk", function(){
  $("#dropdown-menu-category input[type='checkbox']").prop('checked', this.checked);
 });

$(document).on("change", "#dropdown-menu-category2-chk", function(){
   $("#dropdown-menu-category2 input[type='checkbox']").prop('checked', this.checked);
 });

$(document).on("change", "#dropdown-menu-category3-chk", function(){
  $("#dropdown-menu-category3 input[type='checkbox']").prop('checked', this.checked);
 });

 // and so on....

しかし、このコードでは、変数 i == 5!

function setDropDowns(){
  var idList = ['category', 'category2', 'category3', 'category4', 'category5']
  for(var i = 0; i < idList.length; i++){
    $(document).on("change", "#dropdown-menu-"+idList[i]+"-chk", function(){
      $("#dropdown-menu-" +idList[i] +" input[type='checkbox']").prop('checked', this.checked);
        debugger; // i == 5; idList[i] === undefined
    });
  }
}

と言っても

for(var i = 0; i < idList.length; i++){
  var id = dropDownCheckBoxItemList[i];
  $(document).on("change", "#dropdown-menu-"+id+"-chk", function(){

コードが実行されるときidと同じになるため、機能しません。'category5'

ループを使用して機能させるにはどうすればよいですか? DRYのルールを破りたくない。

4

1 に答える 1

3

iループの各反復での値をキャプチャする必要があります。これを行うには、すぐに呼び出される関数式を使用して新しいスコープを導入します。

for(var i = 0; i < idList.length; i++) {
    (function (i) {
        $(document).on("change", "#dropdown-menu-"+idList[i]+"-chk", function() {
            // etc...
        });
    }(i));
}
于 2013-02-22T07:36:03.040 に答える