使用键盘选择单选按钮时,更改事件未触发

 $("input[name='my_radio_button']").change(function(){ if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ do_this_stuff(); } else { do_other_stuff(); } });    

(假设完整的HTML和脚本在所有准备就绪时触发)

单击以选择单选选项时,更改事件似乎触发,但在使用键盘更改选择时则不会触发。 可以做些什么吗?

编辑 – 如果我使用bindlive没有区别 – 这只是一个错误吗?

澄清一下,即使失去焦点,事件也不会触发。

编辑2 – 没有人知道这个的原因?

编辑3 – 正如DonaldIsFreak指出这似乎是一个铬问题

这是一个可靠的修复http://evilstreak.co.uk/blog/fixing-change-events-on-radios

使用它,这就是你用你的例子实现它的方法:这里是以下代码的演示 http://www.jsfiddle.net/uDkdJ/1/我在FF3.6,IE8,Safari5中测试了这个演示, Chrome7和Opera10.65

 $.fn.fix_radios = function() { function focus() { if ( !this.checked ) return; if ( !this.was_checked ) { $( this ).change(); } } function change( e ) { if ( this.was_checked ) { e.stopImmediatePropagation(); return; } $( "input[name=" + this.name + "]" ).each( function() { this.was_checked = this.checked; } ); } return this.focus( focus ).change( change ); } $(function() { $( "input[type=radio]" ).fix_radios(); $("input[name='my_radio_button']").change(function(){ if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ do_this_stuff(); } else { do_other_stuff(); } }); }); 

在jquery 1.4.2中,@ selector不起作用。 查看此示例以查看它是否对您有用,请按“单击”更改“更改”事件。

HTML

    

JavaScript的:

 $("input[name='rdio']").click(function(){ if ($("input[name='rdio']:checked").val() == 'a') $("#test").append("
a
"); else if ($("input[name='rdio']:checked").val() == 'b') $("#test").append("
b
"); else $("#test").append("
c
"); });


ref 1
参考2

不幸的是,使用键盘更改单选按钮时不会触发更改事件,直到您失去焦点。

如果要解决此问题,可以始终设置监视状态的计时器,并在事件发生更改时调度该事件。 像(伪代码)的东西:

 var monitorRadio = function(radio) { var state = $("input[@name='']:checked").val(); $(radio).data("state", state); var func = function() { var state = $("input[@name='']:checked").val(); if (state != $(radio).data("state")) { $(radio).data("state", state); // dispatch the change event $(radio).change(); } setTimeout(100, func()); }; func(); } 

我没有太多运气让单选按钮在我的jsfiddle中用箭头键改变它的状态,所以这是一个盲目的答案:

使用.keypress()相同的规则,关于不会改变,直到失去焦点适用于选择框,我已成功使用.keypress()那里

http://api.jquery.com/keypress/

 $("input[name='my_radio_button']").bind('change keypress', function(){ if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ do_this_stuff(); } else { do_other_stuff(); } }); 

此方法的问题在于,当用户按下某个键时,该事件将触发一次,而当它失去焦点时,该事件将再次触发。 我不确定do_this_stuff()do_other_stuff()做什么的,但是如果它们不止一次触发是个问题,你可以用var修复它以检查以前的值是什么,所以你知道它是否真的改变了:

 $("input[name='my_radio_button']").bind('change keypress', function(){ if ($(this).value() != prevValue) { if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ do_this_stuff(); } else { do_other_stuff(); } } prevValue = $(this).value(); });