Jquery id选择器变量无法绑定到onchange

时间:2012-06-20 18:46:11

标签: javascript jquery variables dynamic jquery-selectors

我有一个输入区域列表,其中id为“contact1_title”,“contact2_title”,“contact3_title”....

此表格中还有一个选择列表,ID为“contact1_name”,“contact2_name”,“contact2_name”....

我想写一个循环来动态绑定选择的onchange函数。

这是我的代码:

for(var j=1;j<6;j++){                        
                    $('#contact'+j+'_name').change(function() {
                        alert(j);
                        //json.engineer is a json object
                        $('#contact'+j+'_title').val( json.engineer[this.selectedIndex-1].title );
                    });
}

当我更改选择时,它始终会发出警告6.

和标题输入区域不能通过选择更改。

这是否意味着javascript中的变量总是会改变?

如何动态绑定动作?

我可以通过使用“this.name.split(”_“)[0]来破解它,但代码看起来很难看。

先谢谢。

3 个答案:

答案 0 :(得分:2)

通过关闭包裹您的change功能:

for(var j=1;j<6;j++){     
    (function(j){                   
         $('#contact'+j+'_name').change(function() {
             alert(j);
             //json.engineer is a json object
             $('#contact'+j+'_title').val( json.engineer[this.selectedIndex-1].title );
         });
     })(j);
}

问题是,当您点击时,您的循环已经结束,因此j等于6

答案 1 :(得分:1)

另一种解决方案是将计数器作为事件数据传递:

for(var j=1;j<6;j++){                        
    $('#contact'+j+'_name').change({index: j}, function(event) {
        $('#contact' + event.data.index + '_title')
           .val(json.engineer[this.selectedIndex-1].title );
    });
}

如果您可以避免使用for循环,那就更好了,但这取决于您的标记以及您是否可以控制已创建的元素,因为您可能需要对其进行调整。

答案 2 :(得分:0)

已经有一个闭包,有效地使用它。

for(var j=1;j<6;j++){                        
     $('#contact'+j+'_name').change(function() {
     var k=j;
     alert(k);
     //json.engineer is a json object
     $('#contact'+k+'_title').val( json.engineer[this.selectedIndex-1].title );
     });
}