2010-10-26 15 views
14
<script> 
$("input[name='my_radio_button']").change(function(){ 
    if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ 
       do_this_stuff(); 
    } else { do_other_stuff(); } 
}); 
</script> 

<input type="radio" name="my_radio_button1" id="radio1" value="ONE" checked /> 
<input type="radio" name="my_radio_button2" id="radio2" value="TWO" /> 

(suponiendo HTML completo y la secuencia de comandos de disparar cuando todo esté listo)evento de cambio no disparar cuando se selecciona el botón de radio con teclado

El evento de cambio parece al fuego cuando se hace clic para seleccionar una opción de radio, pero no cuando la selección se cambia con el teclado. ¿Se puede hacer algo acerca de esto?

editar - no hace ninguna diferencia si uso bind o live - ¿Esto es solo un error?

Para aclarar, el evento no se dispara incluso después de perder el foco.

editar 2 - nadie sabe el motivo?

edición 3 - DonaldIsFreak como señaló esto parece ser un problema de cromo

+0

lo que tiene, en el orden en que se encuentra, no se debe trabajar en absoluto, son estás seguro de que obtienes cualquier comportamiento, incluso con un ¿hacer clic? –

+0

@Nick Craver - ¿es esto mejor? – Greg

+1

Cuando ejecuto este script en Firefox, el navegador es exitoso, pero en el navegador Chrome no cambia. Supongo que este problema sobre el controlador de eventos jquery. ¿Qué versión usas jquery? – dz1984

Respuesta

24

aquí es una solución fiable http://evilstreak.co.uk/blog/fixing-change-events-on-radios

y usarlo así es como se llevaría a cabo con su ejemplo: Y aquí es un demo del código de abajo http://www.jsfiddle.net/uDkdJ/1/ probé esta demo en FF3.6, IE8, Safari5 , Chrome7 y 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(); } 
    }); 
}); 
+0

No he tenido la oportunidad de probar esto todavía, pero confío en que funcione. Haré uso de esto. ¡Gracias! – Greg

+0

no funciona cuando hace clic en div alrededor de la radio el navegador verificará automáticamente la radio –

+0

@DoHoaVinh parece funcionar bien. echar un vistazo http://jsfiddle.net/uDkdJ/302/ –

0

Desafortunadamente, botones de radio No activar los eventos de cambio cuando se cambia con el teclado, hasta que se pierde el foco.

Si desea evitar este problema, siempre puede configurar un temporizador que supervisa el estado y distribuye un evento cuando cambia. Algo así como (pseudocódigo):

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(); 
} 
+0

Gracias por la solución, pero mi código no funciona, incluso * después de * los botones de radio pierden el foco. Voy a buscar otro campo y jquery simplemente ignora el cambio por completo. El cuadro de selección, por ejemplo, funciona correctamente cuando se cambia y el foco se pierde. – Greg

0

no estoy teniendo mucha suerte para conseguir el botón de radio para cambiar su estado con las teclas de flecha en mi jsFiddle, así que aquí tiene una respuesta ciega:

Uso .keypress() El mismo regla de no cambiar hasta perder el enfoque se aplica para seleccionar las cajas, y yo he utilizado con éxito .keypress() no

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

0
$("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(); } 
}); 

El problema con este método es que el evento se disparará una vez cuando el usuario presione una tecla, y nuevamente cuando pierda el foco. No estoy seguro de lo que do_this_stuff() y do_other_stuff() hacer, pero si ellos disparar más de una vez es un problema, se podría solucionar este problema con una var para comprobar cuál es el valor anterior era, para saber si se trata en realidad cambió:

$("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(); 
}); 
7

En jquery 1.4.2 @ selector no funciona. Mire este ejemplo para ver si es útil para usted, cambie el evento de "cambio" por "clic".

html

<input type="radio" name="rdio" value="a" checked="checked" /> 
<input type="radio" name="rdio" value="b" /> 
<input type="radio" name="rdio" value="c" /> 

<br /> 

<div id="test"></div> 

javascript:

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

example
ref 1
ref 2

+0

Esto funciona como un encanto! ¡Gracias! – KManohar

Cuestiones relacionadas