我有一个输入区域列表,其中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]来破解它,但代码看起来很难看。
先谢谢。
答案 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 );
});
}