多个元素上的动态绑定处理程序将仅调用最后一个绑定函数

时间:2014-05-23 16:03:40

标签: javascript jquery

http://jsfiddle.net/7CV88/8/

在此代码段中,我尝试将更改绑定到#r(Nth)e <input>元素,以更改#r(N+1th)s <input>元素的内容。但是,当我更改任何第N个<input>元素时,显示的消息始终是&#34; #r(最后N)e更改处理程序&#34;

for(var i = 1; i < numRanges; i++){
    $('#r'+i+'e').change(function(){
        $('#messages').html('#r'+i+'e change handler');
        $('#r'+(i+1)+'s').val($('#r'+i+'e').val());
    });
}

2 个答案:

答案 0 :(得分:1)

这是一个典型的&#34;关闭&#34;问题。

我正在尝试以最简单的方式摆脱关闭问题,所以我建议这种方式不正确:

for(var i = 1; i < numRanges; i++){
    $('#r'+i+'e').change(function(){
        var tempVariable = i;
        $('#messages').html('#r'+tempVariable +'e change handler');
        $('#r'+(tempVariable +1)+'s').val($('#r'+tempVariable +'e').val());
    });
}

感谢你的学习,我意识到自己的错误,所以我根据他们的建议创建了一个测试模型:

var list = $("div");
for(var i = 0; i < list.length; i++){
    $(list[i]).click((function(x){
        return function(){alert(x);};
    })(i));
}

http://jsfiddle.net/9qBXn/

HTH

答案 1 :(得分:1)

您应该使用所谓的 事件数据 i的值传递到onchange事件处理程序中:

for(var i = 1; i < numRanges; i++){
  $('#r'+i+'e').change(i, function(e){
     $('#messages').html('#r'+e.data+'e change handler');
     $('#r'+(e.data+1)+'s').val($('#r'+e.data+'e').val());
  });
}

Updated Demo.

注意:这只是直接 回答您提出的问题,我知道您的代码很乱,修复它不是主要的事情做。