1

我在表单中有输入区域列表,其 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]" 破解它,但代码看起来很难看。

先谢谢了。

4

3 回答 3

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.

于 2012-06-20T18:47:14.667 回答
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循环,那就更好了,但这取决于您的标记以及您是否可以控制创建的元素,因为您可能必须调整它们才能这样做。

于 2012-06-20T18:57:07.917 回答
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 );
     });
}
于 2012-06-20T18:52:17.230 回答