2012-10-12 34 views
0

我有一个for循环,它遍历表单中的依赖字段。阵列看起来像这样:如何在for循环中附加onchange处理程序

var dependentFields = [ 
    { parent: FLDID_LABEL, children: [FLDID_LABEL_TEMPLATE, FLDID_LABEL_INSTRUCTIONS], choiceTrigger: 'Yes', markAsReq: true }, 
    { parent: FLDID_SHIP_TO, children: [FLDID_SHIP_TO_ADDR], choiceTrigger: 'No', markAsReq: true } 
]; 

我有一个函数被调用来附加所有的事件处理程序。为了简单起见,我将只显示发生问题的循环。

function attachEventHandlers() { 
    // begin dependent fields 
    for (var i = 0; i < dependentFields.length; i++) { 
     var o = dependentFields[i]; 
     $('#' + o.parent).change(function() { 
      var visible = $('#' + o.parent + ' :selected').text() === o.choiceTrigger; 
      for (var c = 0; c < o.children.length; c++) { 
       var child = o.children[c]; 
       showField(child, visible); 
       if (o.markAsReq && $('#' + child).val() === '') { 
        MarkFieldAsRequired(child); 
       } 
      } 
     }); 
    } 
} 

只有第二个依赖字段有效,第一个依赖字段没有。我认为这与从外部函数引用var ivar o的方式有关。有效地将相同的事件处理程序附加到所有依赖字段。我怎样才能解决这个问题?

编辑:这里是一个错误的jsfiddle:http://jsfiddle.net/H3Bv2/4/ 请注意如何更改任何父母只影响第二个孩子。

+0

你可以设置[小提琴](http://www.jsfiddle.net)吗?看着这个,看起来你的绑定是正确的。 – davehale23

回答

0

我想通了。使用jQuery.each让我避免在循环中定义变量。 这里是我的解决方案:

function attachEventHandlers() { 
    // begin dependent fields 
    $.each(dependentFields, function (i, o) { 
     $('#' + o.parent).change(function() { 
      var visible = $(':selected', this).text() === o.choiceTrigger; 
      for (var c = 0; c < o.children.length; c++) { 
       var child = o.children[c]; 
       showField(child, visible); 
       if (o.markAsReq && $('#' + child).val() === '') { 
        MarkFieldAsRequired(child); 
       } 
      } 
     }); 
    }); 
} 
1

的解决方案在这里看看:JavaScript closure inside loops – simple practical example

你的原始代码是指在每一个回调函数,一个变量o是在循环里创造的 - 并重新分配在每个迭代变量的值,所以所有的回调的最终使用分配最后值。

+0

我没有把这个标记为正确答案,因为你没有回答这个问题。我知道问题是什么。但我正在努力寻找相关链接。 – styfle