如何将监听器连接到多个单选按钮?

我有三个这样的单选按钮:

Yes No Yes No Yes No 

我正在尝试为每个单选按钮添加一个监听器,以便在更改时通知我。 我正在做这样的事情:

 for (var i = 1; i <= 3; i++) { $("input[name='P_" + i + "']").live('change', function () { doProcessing("P_" + i, $("input[name='P_" + i + "']:checked").val()); }); } 

但是,这似乎不起作用。 它调用doProcessingi设置为4,因为这是for循环结束时i的值。 在我的案例中添加事件处理程序的正确方法是什么?

尝试

 $('input:radio').on('change', function(){ //access value of changed radio group with $(this).val() }); 

或者,如果您正在使用

 $('input:radio').live('change', function(){ //do stuff with $(this).val() }); 

与任何异步迭代值一样,您需要关闭循环中的值:

 for (i = 0; i < 3; i++) { (function(i){ ...your code here... }(i)); } 

到调用事件处理程序时, i变量的值将达到其最大值(在本例中为3 )。

将数据传递给每个处理程序的另一种方法是使用on方法的data参数:

 for (i = 0; i < 3; i++) { $(...selector...).on('change', null, {i:i}, function (e) { //access the i value with: e.data.i }); } 

简单地在处理程序中检查正确的值并使用类来附加事件可能会更好:

 $(document).on('change', '.someClass', function (e) { var i, $this; $this = $(this); i = $(this).attr('name').substr(2); i = parseInt(i, 10); ...your code here... }); 

如果您无法更改标记,则可以使用'[name^="P_"]'代替'.someClass'

您必须使用一个闭包来记住每一步的索引值。 以下是执行此操作的众多可能方法之一:

 for (var i = 1; i <= 3; i++) { $("input[name='P_" + i + "']").live('change', createListener(i)); } function createListener(index) { return function() { doProcessing("P_" + index, $("input[name='P_" + index + "']:checked").val()); } }