如何将监听器连接到多个单选按钮?
我有三个这样的单选按钮:
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()); }); }
但是,这似乎不起作用。 它调用doProcessing
, i
设置为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()); } }